MongoDB>将新项添加到数组内的对象中

时间:2017-02-25 22:54:34

标签: mongodb mongodb-query aggregation-framework

我有一个看起来像这样的集合:

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

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

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

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

关于我做错了什么的任何想法?

1 个答案:

答案 0 :(得分:2)

由于无法更新多个数组子文档(检查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请求修复您的初始错误消息(但您的初始请求不会更新所有数组元素)