3

我看不出使用它的区别:

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

并且不使用它;

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

文档中的示例。我不清楚。

感谢您的评论,但如果我使用{"$set" : {"array_field" : [{'f' : 'v'}] }}它添加{'f' : 'v'}到数组而不是用 替换数组[{'f' : 'v'}],那么为什么 $set 不将数组替换为新数组?

4

2 回答 2

6

update({"name" : "nick"}, {"age" : 50})用 only替换整个对象{"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 回答