$ set在MongoDB中做了什么?

时间:2013-01-25 16:46:36

标签: mongodb

我看不出使用它之间的区别:

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

并且没有使用它;

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

来自documentation中的示例。我不清楚。

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

2 个答案:

答案 0 :(得分:6)

update({"name" : "nick"}, {"age" : 50})仅用{"age" : 50}替换完整对象

运行上述更新后运行find({"name" : "nick" })将返回找不到文档错误。

使用$ set将只允许更新原始对象的“age”参数。

Karl Seguin的Little Mongodb Book对替换和设置之间的区别有很好的解释。

答案 1 :(得分: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" } ] }