我应该从以下开始:我了解 MongoDB 以及一般的文档式数据库。
我有一个看起来像这样的集合:
{
"_id" : ObjectId("554a5e72b16f31ff0894310e"),
"title" : "ABC",
"admins" : [
"personA",
"personB",
],
"email_address" : "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="2f6e6d6c6f42565c465b4a014c4042" rel="noreferrer noopener nofollow">[email protected]</a>"
}
{
"_id" : ObjectId("554a5e72b16f31ff0894310f"),
"title" : "Junk Site",
"admins" : [
"personA",
"personB"
],
"email_address" : "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="82e5e3f0e0e3e5e7c2effbf1ebf6e7ace1edef" rel="noreferrer noopener nofollow">[email protected]</a>"
}
{
"_id" : ObjectId("554a5e72b16f31ff08943110"),
"title" : "Company Three Site",
"admins" : [
"personC"
"personD",
],
"email_address" : "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="3c5f53514c5d52450e4c50494f0d7c51454f554859125f5351" rel="noreferrer noopener nofollow">[email protected]</a>"
}
我需要做的是将管理员列表从公司一
附加到公司三
,这样公司三
现在有四名管理员(A、B、C、D)。
我尝试了以下操作,因为它对我来说似乎非常简单 - 从源获取数据并直接附加到目标:
db.runCommand({
findAndModify : 'sites',
query : {'title' : 'Company Three Site'},
update : { '$addToSet' :
{'admins' :
db.projects.find({'title' : 'ABC'}, {'_id' : 0, 'admins' : 1}
}
}
})
但是,这不能正常工作。
我仍在尝试找出可以直接执行此操作的方法,但是问题......
1)使用单个命令是否可以实现这一点,还是我需要将其拆分? 2)我的逻辑思维是否有意义,或者我应该采用 MongoDB 风格数据库更传统的其他/更简单的方式来做到这一点?
最佳答案
db.projects.find
实际上返回一个光标,您绝对不希望将其添加到集合中。由于您提前知道您只会找到一个值,因此您可以通过使用 .next().admin
专门从光标中获取属性 - 但请记住,这将仅使用从.find
返回的第一个值。否则,我认为你将不得不使用循环。
$addToSet
还将添加整个数组,因此您必须 append multiple values using $each
一起:
db.runCommand({
findAndModify: 'sites',
query: {'title': 'Company Three Site'},
update: {
$addToSet: {
"admins": {
$each: db.projects.find(
{"title": "ABC"},
{"_id": 0, "admins": 1}
).next().admins
}
}
}
})
关于mongodb - 使用 $addToSet 使用另一个数组字段更新数组字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30087153/