我有如下文件:

{
    _id: "00112233",
    array: [
        {
            _id: "potatoes",
            amount: 5
        },
        {
            _id: "carrots",
            amount: 6
        }
    ]
}

我需要更新或推送文档,这样如果数组中有一个文档,它就会被替换,如果没有,它就会被推送。
如果我尝试这样更新:
db.collection.update(
    { _id: "00112233" },
    {
        "$push": { "array": { "$each": [
            {
                _id: "potatoes",
                amount: 6
            },
            {
                _id: "apples",
                amount: 2
            }
        ]}}
    }
)

在数据库中我会找到两个“土豆”字段。但如果我尝试用“addtoset”替换“push”,我就不会更新“potates”字段。
我有没有办法只在一个查询中做到这一点?

最佳答案

不幸的是,您无法在单个更新操作中获得预期的结果。
addToSet不适用于此方案,因为数组已嵌入文档。addToSet检查属性名称和值是否匹配。如果找到匹配,它什么也不做。如果未找到匹配项,则会将数据添加到数组属性中。
在上述“土豆”的情况下,土豆的数量值不匹配。所以它在数组中插入一个新元素。结果是两个土豆有两个不同的值。

{
                _id: "potatoes",
                amount: 6
            }

您可能需要执行两个更新操作。
1)使用$set更新数组字段的值(如果它存在)
db.collection.update(
 { _id: "00112233", "array._id": "potatoes"},

 {
        "$set": { "array.$":
            {
                _id: "potatoes",
                amount: 7
            }

        },

    }

);

2)如果数组字段不存在新元素,则使用$addToSet
db.collection.update(
 { _id: "00112233"},

 {
        "$addToSet": { "array":
            {
                _id: "apples",
                amount: 7
            }

        },

    }

);

关于arrays - MongoDB $ addToSet替换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39776615/

10-09 13:45