我有如下文件:
{
_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/