我有一份像这样的mongo文件.

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

我希望能够使用单个mongo命令插入和更新array,并且不在find()中使用条件,然后根据对象的存在运行insert()update().

id是我想要的 Select 项.因此,如果我用以下内容更新数组:

{
    "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"
        }
    }
})

我需要一种数组项的插入.

我必须以编程方式完成这项工作,还是可以通过一个mongo调用完成这项工作?

推荐答案

我不知道有哪个选项会像MongoDB 2.2那样插入嵌入式数组,所以您可能需要在应用程序代码中处理这个问题.

假定要将嵌入数组视为虚拟集合的类型,则可能需要考虑将数组建模为单独的集合.

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

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

这不符合按id匹配数组元素的确切用例,但如果您知道预期的当前值,则可能会很有用.

Node.js相关问答推荐

promise 所有映射或反对

MongoDB:更新批量操作中许多不能正常工作的内容

根据我的测试,为什么在编写Varint代码方面,NodeJS要比Rust快这么多?

如何在Mongoose中调用动态Collection ?

对于具有重叠列的组合键,在冲突&q;上没有唯一或排除约束匹配错误

验证器功能在mongoose 中不起作用

为什么我的 Node.js 应用程序在登录时无法正确验证密码(使用 Passport-local 和 bcryptjs)?

无法使用 node 预签名 url 从 React 将图像文件上传到 s3

如何删除mongodb中嵌套数组中所有出现的数组元素

使用mongoose 创建新文档并仅取回选定的字段

Discord.js V14 interaction.editReply 给出了一个无效的 webhook 令牌错误

fs.writefile 选项参数的可能值,尤其是只读文件的整数

来自 Node-aws 的 Dynamo Local:所有操作都失败无法对不存在的表执行操作

如何在 node 中找到引用站点 URL?

gyp WARN EACCES 用户root没有访问开发目录的权限

Node.js, require.main === 模块

遍历 NodeJS 中的一系列日期

Node.js 17.0.1 Gatsby 错误-数字信封 routine ::不支持 ... ERR_OSSL_EVP_UNSUPPORTED

在 react-router v4 中使用 React IndexRoute

Nodejs将字符串转换为UTF-8