首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用多个嵌套文档更新文档字段

使用多个嵌套文档更新文档字段
EN

Stack Overflow用户
提问于 2020-01-10 04:57:55
回答 1查看 177关注 0票数 0

我有一个包含字段files(以及其他字段)的现有MongoDB文档。files字段是一个对象,现在我想用几个嵌套的文档更新这个字段。我已经成功地使用以下语法插入了一个嵌套文档:

代码语言:javascript
复制
db.collection.updateOne(
    { "id": 1 },
    {
        $set: {
            "files":
            {
                "filename1": {
                    "a": "Lorem ipsum dolor",
                    "b": "Sit amet consectetur",
                    "c": "Adipiscing elit"
                }
            }
        }
    })

接下来,我尝试将另外两个文档同时插入到file字段中,但失败了

代码语言:javascript
复制
db.collection.updateOne(
    { "id": 1 },
    {
        $set: {
            "files":
            {
                "filename2": {
                    "d": "Lorem ipsum dolor",
                    "e": "Sit amet consectetur",
                    "f": "Adipiscing elit"
                }
            }
{
        "filename3": {
            "g": "Duis aute irure",
            "h": "Labore et dolore",
            "i": "Eiusmod tempor incididunt"
        }
    }
}})

在这不起作用后,我尝试使用第一个代码块逐个插入记录,但插入了filename2 (我不想覆盖现有的filename1)。此文档已插入到files对象中,但覆盖了现有文档filename1。我尝试了几种不同的变体,但都不起作用。

任何关于如何在一个字段中嵌套多个文档的反馈/帮助都会很有帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-10 05:42:49

它不能工作,因为您的更新查询有几个问题,请检查以下内容:

代码语言:javascript
复制
db.collection.updateOne(
    { "id": 1 },
    {
        $set: {
            "files":
            {
                "filename2": {
                    "d": "Lorem ipsum dolor",
                    "e": "Sit amet consectetur",
                    "f": "Adipiscing elit"
                },
                "filename3": {
                    "g": "Duis aute irure",
                    "h": "Labore et dolore",
                    "i": "Eiusmod tempor incididunt"
                }
            }
        }
    })

上面的查询可以工作,但这里有一个问题-它将用正在发送的新files替换现有的files字段,因为您使用的是$set,这将用新值替换现有字段(如果旧值与新值不同)。

如果files是一个数组,您可以使用$push$addToSet将新值添加到现有的files字段中(然后您只需将$set替换为这两个字段中的一个就可以了),但是如果您希望将files作为一个对象,则需要读取它并在代码中使用.表示法注入新值,然后使用$set将整个files写回MongoDB,这是对DB的两次调用。在另一种方式中,您可以通过以下方式在一个DB调用中完成此操作:

代码语言:javascript
复制
db.updateObject.updateOne({"id": 1}, {
    $set: {
       /** Same like programming language you use `.`,
           You're not replacing files rather you're adding new objects to files,
           If 'files.filename2' already exists in DB then it would be updated. */
        'files.filename2': {
            "d": "Lorem ipsum dolor",
            "e": "Sit amet consectetur",
            "f": "Adipiscing elit"
        }, 'files.filename3': {
            "g": "Duis aute irure",
            "h": "Labore et dolore",
            "i": "Eiusmod tempor incididunt"
        }
    }
})

这将使用其中的两个新对象更新files对象:

代码语言:javascript
复制
/* 1 */
{
    "_id" : ObjectId("5e179dac627ef7823643cd97"),
    "id" : 1,
    "files" : {
        "filename1" : {
            "a" : "Lorem ipsum dolor",
            "b" : "Sit amet consectetur",
            "c" : "Adipiscing elit"
        },
        "filename2" : {
            "d" : "Lorem ipsum dolor",
            "e" : "Sit amet consectetur",
            "f" : "Adipiscing elit"
        },
        "filename3" : {
            "g" : "Duis aute irure",
            "h" : "Labore et dolore",
            "i" : "Eiusmod tempor incididunt"
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59671989

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档