一尘不染

mongo可以更新阵列数据吗?

node.js

我有一个像这样的mongo文件。

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

我希望能够插入和更新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调用来执行此操作?


阅读 175

收藏
2020-07-07

共1个答案

一尘不染

我不知道在MongoDB 2.2上会向上插入嵌入式阵列的选项,因此您可能必须在应用程序代码中进行处理。

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

您不能基于嵌入式数组中的字段值进行upsert,但是$addToSet如果尚不存在嵌入式文档,则可以使用它来插入:

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

这不适合您使用idarray元素匹配的确切用例,但是如果您知道期望的当前值,则可能会有用。

2020-07-07