如何在Mongo中更新数组中的对象

时间:2013-12-18 21:33:47

标签: mongodb updates

我非常擅长SQL,但即使是最简单的Mongo查询也在挣扎。

post集合中的文档看起来像这样(简化)

{
     '_id': 5
     'body': 'Correct horse battery staple',
     'comments': 
     [{
          user_id: '123'
      }, 
      {
          user_id: '456'
      }, 
      {
          user_id: '123'
      }]
}

我需要为所有帖子更新user_id's'123'的{​​{1}}。

在SQL数据库中,我会有一个'abc'表和一个post表并执行此操作:

comment

3 个答案:

答案 0 :(得分:1)

我认为您正在寻找FindAndModify

db.runCommand({
  findAndModify: "post",
  query: { user_id: 123 },
  update: { $set: { user_id: 'abc' } }
})

修改

如果multi设置为true,我相信您可以使用update对集合执行类似操作:

db.post.update(
  { user_id: 123 },
  { $set: { user_id: 'abc' } },
  { multi: true }
)

答案 1 :(得分:1)

默认情况下,mongodb update命令只会更新一个文档。

db.collection.update({document to be found},{changes to be done})

要更新多个文档,您应该包含关键字。

db.collection.update({document to be found},{changes to be done},{multi:true})

假设您的文档结构如下:

{
    "_id": 5,
    "body": "Correct horse battery staple",
    "comments": [{"user_id": "123"},{"user_id": "456"},{"user_id": "123"}]
}
{
    "_id": 6,
    "body": "Correct horse battery staple",
    "comments": [{"user_id': "23"},{"user_id": "123"},{"user_id": "13"}]
}

在这种情况下,我可能需要更新数组内的多个元素以及多个文档。没有默认的mongodb查询来执行此操作。 相反,我将遍历文档并按如下方式执行。

// loop until all documents has been updated
while(db.post.find({'comments.user_id':'123'}).count()!=0) 
{
    db.post.update(
                     { 'comments.user_id':'123' },
                     { $set:{'comments.$.user_id':'abc'} },
                     { multi:true }
                   )
}

第一次循环播放后,收集后将如下所示:

{
    "_id": 5,
    "body": "Correct horse battery staple",
    "comments": [{"user_id": "abc"},{"user_id": "456"},{"user_id": "123"}]
}
{
    "_id": 6,
    "body": "Correct horse battery staple",
    "comments": [{"user_id": "23"},{"user_id": "abc"},{"user_id": "13"}]
}

第二次循环播放后,收集后将如下所示:

{
    "_id": 5,
    "body": "Correct horse battery staple",
    "comments": [{"user_id": "abc"},{"user_id": "456"},{"user_id": "abc"}]
}
{
    "_id": 6,
    "body": "Correct horse battery staple",
    "comments": [{"user_id": "23"},{"user_id": "abc"},{"user_id": "13"}]
}

在第三次循环运行中,循环终止。

答案 2 :(得分:0)

您可以从v3.6使用arrayFilters

db.post.updateMany(
  { 'comments.user_id': '123' },
  { 
    $set: {
      'comments.$[elem].user_id': 'abc' 
    }
  },
  { 
    arrayFilters: [
      { 'elem.user_id': '123' }
    ]
  }
);