3

私はそれを使用することの違いを見ることができません:

update({"name" : "nick"}, {"$set" : {"age" : 50}})

そしてそれを使用していません。

update({"name" : "nick"}, {"age" : 50})

ドキュメントの例から。それは私には明らかではありません。

コメントありがとうございますが、それを使用すると、配列を に置き換えるのではなく、配列に{"$set" : {"array_field" : [{'f' : 'v'}] }}追加されます。なぜ $set は配列を新しいものに置き換えないのですか?{'f' : 'v'}[{'f' : 'v'}]

4

2 に答える 2

6

update({"name" : "nick"}, {"age" : 50})完全なオブジェクトを のみに置き換えます{"age" : 50}

上記の更新を実行find({"name" : "nick" })した後に実行すると、ドキュメントが見つからないというエラーが返されます。

$set を使用すると、元のオブジェクトの「年齢」パラメータのみを更新できます。

Karl Seguin のLittle Mongodb Bookには、replace と set の違いに関する非常に適切な説明があります。

于 2013-01-25T16:56:08.013 に答える
0

これは期待どおりに機能しています:

> db.test.insert({"a":1, "b": [{"v":1, "b":1}]})
> db.test.find()
{ "_id" : ObjectId("5102c75c8e48734ea1220a9c"), "a" : 1, "b" : [ { "v" : 1, "b" : 1 } ] }
> db.test.update({"_id" : ObjectId("5102c75c8e48734ea1220a9c")}, {$set: {"b": [{"v":1}]}})
> db.test.find()
{ "_id" : ObjectId("5102c75c8e48734ea1220a9c"), "a" : 1, "b" : [ { "v" : 1 } ] }

JSが配列を解釈する方法だったのではないかと思いましたが、そうではありません。私にとってはうまく機能します。

実行しているクエリを見せてもらえますか? たぶん、完全なスクリプトでこの動作を再現できますか?

編集

あなたのデータが異なっていることに気付いたので、以下に正確に複製しました。

> db.test.insert({"a":1, "b": [{'f':'v'}]})
> db.test.find()
{ "_id" : ObjectId("5102c8868e48734ea1220a9d"), "a" : 1, "b" : [ { "f" : "v" } ] }
> db.test.update({ "_id" : ObjectId("5102c8868e48734ea1220a9d")}, {$set: {"b": [{"f":"b"}]}})
> db.test.find()
{ "_id" : ObjectId("5102c8868e48734ea1220a9d"), "a" : 1, "b" : [ { "f" : "b" } ] }
于 2013-01-25T18:00:18.523 に答える