我正在尝试向嵌套的“messages”文档中添加一条新消息(键为“3”),但$ addToSet或$ push将无效。是否可以将新的消息元素推送到这样的结构?在一开始,messages属性是一个数组,但我的mongodb提供程序将数组转换为这样的结构。仅供参考:我通过node.js和mongojs访问mongodb,但原生的mongodb解决方案也是完美的。
{
"messages" :
{
"0" :
{
"foo": "bar0"
},
"1" :
{
"foo": "bar1"
},
"2" :
{
"foo": "bar2"
},
},
"name" : "MyName"
}
答案 0 :(得分:0)
问题是MongoSoup的编辑器会自动将数组转换为文档集合。当我通过命令行或我的node.js应用程序创建数组时,一切都像我预期的那样。
无论如何,谢谢你...我的坏!
答案 1 :(得分:-1)
基本上你只想添加一个子文档,所以只需$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
字段已存在,则会覆盖它们,因此您需要小心,并且还需要跟踪字段中的最新消息。