2011-01-01 6 views
8

皆さん。私はマンガが大好きです。そして今、私はモンゴーも愛することを学んでいます:-)MongoDB:コレクション内の既存の文書を更新するにはsave()を使用してください。

how to use save() to update an existing document in a collection in MongoDB PHPの説明がありますか?

<?php 
$a=array('_id'=>'test_a','field1'=>'anything'); 
$b=array('_id'=>'test_a','field2'=>'anything else'); 

$m=new Mongo(); 
$c=$m->db->test; 
$c->save($a); 
$c->save($b);//overwrites the previous record 

/* 
//With update() it works fine 
$filter=array('_id'=>'test_a'); 
$update=array('$set'=>array('field2'=>'anything else')); 
$c->update($filter,$update); 
//$c->save($filter,$update);//Also tried... 
*/ 

$f=$c->find(); 
echo $f->count()." found \n"; 
$i=iterator_to_array($f);//mongo cursos iterator 
$m->close();//disconnect mongo 

print_r($i); 
?> 

事実はPHPの例では(保存することである)、オブジェクト間を上書きしますが、私はここに私のテストコードです

> var mongo = db.things.findOne({name:"mongo"}); 
> print(tojson(mongo)); 
{"_id" : "497dab624ee47b3a675d2d9c" , "name" : "mongo"} 
> mongo.type = "database"; 
database 
> db.things.save(mongo); 
> db.things.findOne({name:"mongo"}); 
{"_id" : "497dab624ee47b3a675d2d9c" , "name" : "mongo" , "type" : "database"} 

:-) PHPの「現実」にそれを適用できませんでしたJSの例では、それを更新します。 PHPでJSと同じように再現できることを願っています。

ありがとうございます。 JSの例では

+0

http://www.mongodb.org/display/DOCS/Updating#Updating-ModifierOperationsでは、xが_idフィールドを持っていると、save()はアップサートを行います(xはJSONスタイルのオブジェクトでupsertは更新を意味します)。存在する場合は挿入し、欠落している場合は挿入してください)。 – Roger

+0

私は問題が何かを見ていない、JSとPHPの例は同じことをしないのですか?あなたが期待していることを教えてください。私たちが環境を設定し、コードを実行して出力を見ることを期待しないでください。 – Theo

+0

返事をありがとう。 phpの例を実行すると、save()はオブジェクトを上書きし、JSの例ではオブジェクトを更新します。 PHPでJSと同じように再現できることを願っています。 – Roger

答えて

12

これらの例は、同じことをやっていません...

は、あなたはを追加する同じオブジェクトを変更し、

> var mongo = db.things.findOne({name:"mongo"}); 

次にオブジェクトモンゴを宣言しましたタイプ ...

> mongo.type = "database"; 

PHPの例では、あなたはがオレンジ異なるオブジェクト/文書である二つのオブジェクト...

$a=array('_id'=>'test_a','field1'=>'anything'); 
$b=array('_id'=>'test_a','field2'=>'anything else'); 

これは、JSシェルで次のことのようになる...だから

> var apples = db.things.findOne({name:"mongo"}); 
> var orange = db.things.findOne({type:"database"}); 

りんごを宣言しました ... save()を実行してNEWオブジェクトを渡すと、古いオブジェクトが完全に上書きされます。

あなたのオブジェクトの検索のでがうまく働いていた()更新...そして、オブジェクトのアップデートを実行した

$filter=array('_id'=>'test_a'); 

。 JSの例で...それを交換する新しいオブジェクトを渡すのではなく、

$update=array('$set'=>array('field2'=>'anything else')); 
$c->update($filter,$update); 

を新しいフィールドを渡すあなただけつのオブジェクトがそう、それは基本的にそれを置き換えるのではなく、更新時にそれを付加しました。

正しいPHPコード

次のPHPを使用すると、JSシェルで何をしていた複製でしょう...

<?php 

$connection = new Mongo(); 
$db = $connection->foo; 
$collection = $db->testing; 

// create new object & save 
$a = array('color'=>'red'); 
$collection->save($a); 

// add type = fruit to existing object & save 
$a['type'] = 'fruit'; 
$collection->save($a); 

// print out results. 
echo "<pre>"; 
var_dump($collection->findOne(array("color" => "red"))); 
echo "</pre>"; 

?> 

:私は強くをいただきたい、あなた自身のオブジェクト _id年代を設定し、代わりに私は上記の例で行ったように、ドライバがあなたのためにそれをやらせないことをお勧めします。

+0

ジャスティン、非常に素晴らしい答えをありがとう。私の例では、 '$ a'と' $ b'が実際に異なったオブジェクトであることを考慮せずに、 'save()'には配列の内容だけが与えられていると思っていました。実際、JSの例では、 "upsert"の前に 'findOne()'がありました。この 'findOne()'は '$ filter = array( '_ id' => 'test_a');'のように、PHPの 'update()'に現れますので、次の引数にあるものが挿入されますこのオブジェクトに挿入します。最後の例をありがとう、完璧でした。 – Roger

+0

そして私は自分自身を繰り返さないために私の唯一の '_id'をMongoに与えています。私は、将来の更新を行うために値を特定するユニークな簡単な方法が必要です。 '_id'フィールドを使うのは当然のことでした。しかし、これをしないといい理由があれば、私はそれを他の分野に喜ばせて、モンゴに自分のやり方を決めさせるでしょう。なぜあなたは '_id'フィールドを使わないことをお勧めしますか教えてください。 – Roger

+0

素晴らしい!あなたの質問に答えた場合は、これを「回答」とマークしてください。その横に大きな緑色のチェックマークが付きます。 –

関連する問題