node.js - mongo 可以 upsert 数组数据吗?

我有一个这样的 mongo 文档。

{
    "_id" : ObjectId("50b429ba0e27b508d854483e"),
    "array" : [
        {
            "id" : "1",
            "letter" : "a"
        },
        {
            "id" : "2",
            "letter" : "b"
        }
    ],
    "tester" : "tom"
}

我希望能够使用单个 mongo 命令插入和更新 array,而不是在 find() 中使用条件,然后运行 ​​insert( )update() 取决于对象的存在。

id 是我想成为选择器的项目。所以如果我用这个更新数组:

{
    "id" : "2",
    "letter" : "c"
}

我必须使用 $set 语句

db.soup.update({
    "tester":"tom",
    'array.id': '2'
}, {
    $set: {
        'array.$.letter': 'c'
    }
})

如果我想在数组中插入一个新对象

{
    "id" : "3",
    "letter" : "d"
}

我必须使用 $push 语句

db.soup.update({
    "tester":"tom"
}, {
    $push: {
        'array': {
            "id": "3",
            "letter": "d"
        }
    }
})

我需要一个数组项的 upsert。

我必须以编程方式执行此操作,还是可以通过单个 mongo 调用执行此操作?

最佳答案

我不知道有一个选项会像 MongoDB 2.2 那样插入到嵌入式数组中,因此您可能必须在应用程序代码中处理这个问题。

鉴于您希望将嵌入式数组视为一种虚拟集合,您可能需要考虑将数组建模为单独的集合。

您不能根据嵌入数组中的字段值执行 upsert,但您可以使用 $addToSet如果嵌入的文档不存在,则插入它:

db.soup.update({
    "tester":"tom"
}, {
    $addToSet: {
        'array': {
            "id": "3",
            "letter": "d"
        }
    }
})

这不适合您通过数组元素的 id 进行匹配的确切用例,但如果您知道预期的当前值,可能会有用。

https://stackoverflow.com/questions/13588342/

相关文章:

java - 自动配置数据源失败 : 'spring.datasource.url' is not

mongodb - 在MongoDB中获取数组的第n个元素

windows - 如何在 Windows 中连接到 MongoDB?

javascript - 如何在 Mongoose 模型中定义方法?

mongodb - 在 MongoDB 中存储日期的最佳方式是什么?

ubuntu - MongoDB 仅在 Ubuntu 上以 root 身份运行时才有效 - 数据目录

ubuntu - 为什么我不能启动mongodb

shell - MongoDB 正在运行但无法使用 shell 连接

c# - MongoDB 和 C# : Case insensitive search

mongodb - mongod.service 启动失败 : Unit mongod. 找不到服务