8

みんな。私はマンガが大好きです。そして今、私もモンゴを愛することを学んでいます:-)

MongoDB PHP のコレクション内の既存のドキュメントを更新するために save() を使用する方法の説明がありますか? しかし、私はそれを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
$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 の例では save() がオブジェクトを上書きしますが、JS の例ではオブジェクトを更新します。JSと同じようにPHPでも再現できればいいのですが。

前もって感謝します。

4

1 に答える 1

12

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

JS の例では、オブジェクトmongoを宣言しました

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

次に、同じオブジェクトを変更してタイプを追加しました...

> mongo.type = "database";

PHP の例では、2 つのオブジェクトを宣言しました ...

$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 オブジェクトを渡すと、古いオブジェクトが完全に上書きされます。

オブジェクトを検索したため、update()は正常に機能しました...

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

次に、そのオブジェクトで更新を実行しました。新しいオブジェクトを渡して置き換える代わりに、新しいフィールドを渡す...

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

JS の例では、オブジェクトが 1 つしかないため、基本的に、それを置き換えるのではなく、更新時に追加しました。

正しい 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を設定せず、上記の例で行ったようにドライバーに任せることを強くお勧めします。

于 2011-01-02T03:37:53.890 に答える