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

Mongodb 如何在Mongo中更新数组中的对象,mongodb,updates,Mongodb,Updates,我非常擅长SQL,但即使是最简单的Mongo查询,我也在苦苦挣扎 我在post集合中的文档如下所示(简化) 我需要将所有帖子的用户id更新为'abc' 在SQL数据库中,我将有一个post表和一个comment表,并执行以下操作: UPDATE comment SET user_id = 'abc' WHERE user_id = '123' 我想你在寻找: 编辑 如果multi设置为true,我相信您也可以对集合执行类似操作: db.post.update( { user_id: 123

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

我在
post
集合中的文档如下所示(简化)

我需要将所有帖子的
用户id
更新为
'abc'

在SQL数据库中,我将有一个
post
表和一个
comment
表,并执行以下操作:

UPDATE comment SET user_id = 'abc' WHERE user_id = '123'

我想你在寻找:

编辑

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

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

默认情况下,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"}]
}
在第三次循环运行中,循环被终止。

您可以从v3.6使用

db.post.updateMany(
  { 'comments.user_id': '123' },
  { 
    $set: {
      'comments.$[elem].user_id': 'abc' 
    }
  },
  { 
    arrayFilters: [
      { 'elem.user_id': '123' }
    ]
  }
);
我需要修改所有文档,而不仅仅是一个。我更新了我的问题,使之更加明确。可能重复
{
    "_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"}]
}
db.post.updateMany(
  { 'comments.user_id': '123' },
  { 
    $set: {
      'comments.$[elem].user_id': 'abc' 
    }
  },
  { 
    arrayFilters: [
      { 'elem.user_id': '123' }
    ]
  }
);