将新元素添加到嵌套文档

时间:2014-09-23 15:26:04

标签: node.js mongodb mongojs

我正在尝试向嵌套的“messages”文档中添加一条新消息(键为“3”),但$ addToSet或$ push将无效。是否可以将新的消息元素推送到这样的结构?在一开始,messages属性是一个数组,但我的mongodb提供程序将数组转换为这样的结构。仅供参考:我通过node.js和mongojs访问mongodb,但原生的mongodb解决方案也是完美的。

{
    "messages" : 
    {
        "0" : 
        {
            "foo": "bar0"  
        },
        "1" : 
        {
            "foo": "bar1"  
        },
        "2" : 
        {
            "foo": "bar2"   
        },
    },
    "name" : "MyName"   
}

2 个答案:

答案 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字段已存在,则会覆盖它们,因此您需要小心,并且还需要跟踪字段中的最新消息。