推送到父数组(MongoDB)的特定元素内的嵌套数组

时间:2016-12-17 21:47:09

标签: arrays mongodb meteor

我正在重新思考如何构建当前存储在Users集合中的一些数据。以前,我的服务器会收到消息,找到具有正确profile.website字段的用户文档,并将项目推送到profile.siteMessages数组中:

{
  "_id": "hr9ck5Fis5YuvqCqP",
  "profile": {
    "website": "localhost",
    "siteMessages": [
         {
            "text": "sddsd",
            "createdAt": 1482001227204
         },
     ]
  }
}

我想将结构更改为类似以下内容。而不是在profile的顶级数组中存储多条消息可能来自同一用户的所有消息,而是包含profile.siteVisitors的{​​{1}}字段,然后消息数组:

visitorId

保持上面显示的结构,我将如何查询和更新{ "_id": "dgfsdfdfsdf", "emails": [ { "address": "user2@test.com", "verified": false } ], "profile": { "website": "localhost", "siteVisitors:" [ { "visitorId": "74585242", "messages": [ { "text": "A string", "createdAt": 1482001260853 }, { "text": "Another string", "createdAt": 1482001260854 } ] }, { "visitorId": "76672242", "messages": [ { "text": "A string", "createdAt": 1482001260855 } ] } ] } } 数组?目前,我使用以下内容查询和更新集合:

profile.siteVisitiors.messages

如何更新新结构化的消息数组?我需要匹配Meteor.users.update( {'profile.website': url}, {$push: {'profile.siteMessages': msgItem}}, function(err) { if (err) { console.log('whoops!' + err) } else { //success } }); 个文档User字段,匹配profile.website数组中的visitorId,然后将新元素推入profile.siteVisitors数组,但我不确定这看起来像是一个MongoDB查询。

编辑我已经将以下内容合并到一起似乎有效,但非常难看。我怎样才能改善这个?

messages

1 个答案:

答案 0 :(得分:1)

您可以使用$(update)运算符。

尝试以下查询:

db.collection.update(
    {"profile.website" : "localhost" , "profile.siteVisitors" : {$elemMatch: {"visitorId" :'76672242'} } }, 
    { $push: { "profile.siteVisitors.$.messages": {"text" : <newText>, "createdAt" : <newCreatedDate>} } } 
)

希望这会有所帮助。