【问题标题】:How to upsert an element in mongodb array?如何在 mongodb 数组中插入元素?
【发布时间】:2020-07-23 16:00:14
【问题描述】:

假设我们的文档是这样的

{
   a:1,
   b:[
    {c:120,d:100},
    {c:121,d:110}
   ]
}

现在我如何在这个数组中插入新对象? 假设我想对上述文档执行更新并将{c:200,d:120} 添加到 b,所以我的预期结果如下所示

{
   a:1,
   b:[
    {c:120,d:100},
    {c:121,d:110},
    {c:200,d:120}
   ]
}

还有 $inc 的更新,这意味着假设如果 c 存在,我想将 d 增加 200(假设 c 为 200,并且它已经存在于上述文档中),如果不存在,那么我想插入文档本身。

任何帮助将不胜感激。

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    可以使用$push更新命令来实现。

    db.<Collection-Name>.updateOne({"a": 1}, {"$push": {"b": {"c":200, "d":120}}})
    

    注意:如果您不想在数组中重复元素,请使用$addToSet

    更新:

    我不认为你的精确要求不能通过一个命令来实现。

    您的确切要求可以通过以下脚本实现:

    if (db.test9.findOne({"_id": ObjectId("5f19402abbc59a3864783fc7"), "b.c": 200}, {"_id": 1}) != null) {
        db.test9.updateOne({
            "_id": ObjectId("5f19402abbc59a3864783fc7"),
            "b.c": 200,
        }, {
            "$set": {
                "b.$.d": 120
            }
        })
    } else {
        db.test9.updateOne({
            "_id": ObjectId("5f19402abbc59a3864783fc7"),
        }, {
            "$push": {
                "b": {
                    "c":200, "d":120
                }
            }
        });
    }
    

    【讨论】:

    • 我想根据c的值更新,如果c存在则更新b的值,否则在数组中创建新对象。
    • 我发布的查询将满足您的需求。如果存在c,它会将b 附加到数组中。但是,如果c 不存在,它将根据需要创建一个新对象。如果我理解错了问题,请回复
    • 对不起,在上面的评论中我错误地提到了 b 代替了 d。 IMO 您提到的查询将始终将新对象推送到数组 b。但是如果 c 的值匹配,我想更新数组中已经存在的对象。如果对于 c 的给定值,数组中不存在对象,则应插入新对象(最好应使用 upsert 选项触发插入)。希望这可以解决一些问题。
    • 我不认为它可以通过单个命令来实现。我已经用一个脚本更新了答案,它可以满足您的需求。
    • 是的,看起来是这样。谢谢你的意见。
    猜你喜欢
    • 2014-11-15
    • 1970-01-01
    • 2016-11-05
    • 1970-01-01
    • 2015-08-24
    • 2016-07-06
    • 2015-04-02
    • 1970-01-01
    • 2021-11-12
    相关资源
    最近更新 更多