2014-09-23 52 views
-1

我试图向嵌套的“消息”文档添加新消息(带键“3”),但$ addToSet或$ push不起作用。是否有可能将新的消息元素推送到这样的结构?在开始时,messages属性是一个数组,但是我的mongodb提供者将数组转换为这样的结构。仅供参考:我通过node.js和mongojs访问mongodb,但本地mongodb解决方案也是完美的。将新元素添加到嵌套文档

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

'$ addToSet'和'$ push'只能用于数组(包含在[]中)。在你的文档中,'messages'是一个对象而不是数组。因此,您必须使用'update'语句:'db.collection.update({},{$ set:{“messages.3”:{“foo”:“bar3”}}})' – 2014-09-23 15:31:23

+0

I想到类似的东西,但是我必须先获得消息文档的数量,对吧? – seveves 2014-09-23 15:42:08

+2

这就是为什么你应该使用数组来代替。 – JohnnyHK 2014-09-23 15:42:54

回答

-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场如果它已经存在,所以你必须要小心,你需要保持跟踪在该领域的最新消息也。

+0

OP不以这种方式存储文档。它作为一个数组存储。 – BatScream 2014-09-23 15:49:38

+0

这实际上不是问题所在,实际上标题明确表示它是嵌套文档而不是数组,因此$ push操作符将不起作用 – 2014-09-23 16:02:45

+0

我想那时,标题有误导性,请阅读描述和评论。 – BatScream 2014-09-23 16:04:11

0

问题是MongoSoup的编辑器会自动将数组转换为文档集合。当我通过命令行或我的node.js应用程序创建数组时,所有事情都像我期待的那样。

谢谢无论如何...我的坏!