基本上你只是想添加一个子文档,所以索性$set
婷文件将工作:
db.bar.update({_id : ObjectId("542194f8b32cda36885e1d9e") },
{$set : {"messages.3" : {"foo" : "bar3"}}})
您将需要替换基于适当的匹配标准,而不是我使用过程中的_id在你的真实文件看起来像什么。添加/更新您的样本文件如下全过程:
> foo = {
"messages" : {
"0" : {
"foo" : "bar0"
},
"1" : {
"foo" : "bar1"
},
"2" : {
"foo" : "bar2"
}
},
"name" : "MyName"
}
> db.bar.insert(foo)
WriteResult({ "nInserted" : 1 })
> db.bar.findOne()
{
"_id" : ObjectId("542194f8b32cda36885e1d9e"),
"messages" : {
"0" : {
"foo" : "bar0"
},
"1" : {
"foo" : "bar1"
},
"2" : {
"foo" : "bar2"
}
},
"name" : "MyName"
}
> db.bar.update({_id : ObjectId("542194f8b32cda36885e1d9e") }, {$set : {"messages.3" : {"foo" : "bar3"}}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.bar.findOne()
{
"_id" : ObjectId("542194f8b32cda36885e1d9e"),
"messages" : {
"0" : {
"foo" : "bar0"
},
"1" : {
"foo" : "bar1"
},
"2" : {
"foo" : "bar2"
},
"3" : {
"foo" : "bar3"
}
},
"name" : "MyName"
}
的明显缺陷是,这将覆盖任何现有messages.3
场如果它已经存在,所以你必须要小心,你需要保持跟踪在该领域的最新消息也。
'$ addToSet'和'$ push'只能用于数组(包含在[]中)。在你的文档中,'messages'是一个对象而不是数组。因此,您必须使用'update'语句:'db.collection.update({},{$ set:{“messages.3”:{“foo”:“bar3”}}})' – 2014-09-23 15:31:23
I想到类似的东西,但是我必须先获得消息文档的数量,对吧? – seveves 2014-09-23 15:42:08
这就是为什么你应该使用数组来代替。 – JohnnyHK 2014-09-23 15:42:54