gpt4 book ai didi

arrays - MongoDB $addToSet 替换

转载 作者:可可西里 更新时间:2023-11-01 10:20:30 26 4
gpt4 key购买 nike

我有一个像下面这样的文档:

{
_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
}
]}}
}
)

在数据库中我会找到两个“potatoes”字段。但是,如果我尝试用“addToSet”替换“push”,我将不会更新“potatoes”字段。
有什么方法可以只在一个查询中执行此操作吗?

最佳答案

不幸的是,您无法在单次更新操作中获得预期的结果。

addToSet 不适用于这种情况,因为数组中嵌入了文档。 addToSet 检查属性名称和值是否匹配。如果找到匹配项,它什么都不做。如果未找到匹配项,它将数据添加到数组属性。

在上述“potatoes”的例子中,potatoes 的数量值不匹配。所以它向数组中插入一个新元素。所以结果有两个具有 2 个不同值的土 bean 。

{
_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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com