我非常擅长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
答案 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' }
]
}
);