我看不出使用它之间的区别:
update({"name" : "nick"}, {"$set" : {"age" : 50}})
并且没有使用它;
update({"name" : "nick"}, {"age" : 50})
来自documentation中的示例。我不清楚。
感谢您的评论,但是如果我使用{"$set" : {"array_field" : [{'f' : 'v'}] }}
,它会将{'f' : 'v'}
添加到数组中,而不是用[{'f' : 'v'}]
替换数组,那么为什么不用$ set替换数组新的?
答案 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" } ] }