【问题标题】:MongoDB > Adding a new item into an object inside an arrayMongoDB > 将新项目添加到数组内的对象中
【发布时间】:2018-04-30 06:11:04
【问题描述】:

我有一个如下所示的集合:

{
    _id: ...,
    checkins: [
        {
            id: ...,
            createdAt: 1488052032,
            ...
        },
        {
            id: ...,
            createdAt: 1488052032,
            ...
        }
    ]
}

我想在 idcreatedAt 属性旁边添加一个名为 created 的新元素(在签入内,一个对象数组)。我想为所有没有这个新元素的元素做这件事。

我知道如何检查一个对象中是否已经有一个属性,但是我在添加元素时遇到了一些问题。我正在使用下面的代码并返回一条错误消息:位置运算符没有从查询中找到所需的匹配项

db.profiles.updateMany(
    {},
    {$set: {"checkins.$.created": new Date(0)}}
)

关于我做错了什么有什么想法吗?

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework


    【解决方案1】:

    由于无法按原样更新多个数组子文档(检查this post),您可以匹配至少匹配一个没有created字段的子文档的所有文档,然后将必须的子文档一一更新更新:

    db.profiles.find({
        "checkins": {
            "$elemMatch": { "created": { "$exists": false } }
        }
    }).forEach(function(doc) {
    
        doc.checkins.filter(function(event) {
            return !('created' in event)
        }).forEach(function(event) {
    
            db.profiles.update({
                "_id": doc._id,
                "checkins": {
                    "$elemMatch": { "created": { "$exists": false } }
                }
            }, {
                $set: {
                    "checkins.$.created": new Date(0)
                }
            });
        });
    });
    

    注意elemMatchexists 用于检查字段是否存在。这应该通过您的 updateMany 请求修复了您的初始错误消息(但您的初始请求不会更新您的所有数组元素)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-27
      • 2019-07-20
      • 1970-01-01
      • 1970-01-01
      • 2020-01-01
      相关资源
      最近更新 更多