mongodb - 使用 $addToSet 使用另一个数组字段更新数组字段

标签 mongodb

我应该从以下开始:我了解 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/

相关文章:

javascript - Node.js、socket.io 和 mongojs - 使用 socket.io 的登录表单

javascript - SyntaxError : expected expression, 在 mongoDB 中得到 '}' @(shell):1:0

ruby - MongoDB:如何存储大数组? (ERR Document too large: This BSON documents is limited to 16777216 bytes)

javascript - (moment.js) 格式化从 mongo 检索的日期

python - pymongo + gevent : throw me a banana and just monkey_patch?

MongoDb - "join"或 $ 在两个集合中

c - 使用 C 更新 MongoDB 中数组中的多个值

node.js - 使用 mongoose 转义一些 HTML 标签

MongoDB 计算每个数组元素的文档数

node.js - 为什么在我的 .find() 输出中添加了 "Document"这个词?