gpt4 book ai didi

MongoDB 4.2 将聚合管道更新与数组过滤器相结合

转载 作者:行者123 更新时间:2023-12-04 17:31:37 24 4
gpt4 key购买 nike

我看到 MongoDB 4.2 引入了聚合管道更新,它允许您根据文档中的其他字段设置文档字段。

考虑以下文件

{
ean: "12345",
orderedQty: 2,
fulfilledQty: 1,
"status": "pending"
}

我可以使用以下命令将fulfiledQty 增加1,如果orderedQty 与fulfiledQty 匹配,则相应地设置状态:
db.collection.findOneAndUpdate({}, [
{
"$set": {
"orderedQty": {
"$add": [ "$fulfilledQty", 1 ]
}
},
"$set": {
"status": {
"$cond": {
"if": { "$eq": ["$orderedQty", "$fulfilledQty"] },
"then": "fulfilled",
"else": "pending"
}
}
}
}
])

我的问题:我将如何在数组上执行此操作。假设我有一个这样的文件:
_id: "test",
items: [
{ean: "12345", orderedQty: 2, fulfilledQty: 1, "status": "pending"},
{ean: "67891", orderedQty: 1, fulfilledQty: 1, "status": "fulfilled"}
]

鉴于我有参数 ean = 12345并将值增加 1。如何使用 EAN 12345 定位特定数组项,将满足数量增加 1 并设置状态?我只想对 status 字段和fulfiledQty 字段进行处理,而将 items 数组的其余部分保持原样。所以预期的结果是:
_id: "test",
items: [
{ean: "12345", orderedQty: 2, fulfilledQty: 2, "status": "fulfilled"},
{ean: "67891", orderedQty: 1, fulfilledQty: 1, "status": "fulfilled"}
]

最佳答案

我发现了以下工作流程(仅适用于 mongodb 4.2+),但它非常冗长……

鉴于有两个变量,一个项目标识符(称为 ean )和一个已发货的数量(称为 fulfilledQty )

collection.update({}, [
{
$set: {
items: {
$map: {
input: "$items",
as: "item",
in: {
$mergeObjects: [
"$$item",
{
fulfilledQty: {
$switch: {
branches: [
{
case: {
$eq: ["$$item.ean", ean]
},
then: {
$toInt: {
$add: ["$$item.fulfilledQty", fulfilledQty]
}
}
}
],
default: "$$item.fulfilledQty"
}
}
}
]
}
}
}
}
},
{
$set: {
items: {
$map: {
input: "$items",
as: "item",
in: {
$mergeObjects: [
"$$item",
{
status: {
$cond: {
if: {
$eq: ["$$item.orderedQty", "$$item.fulfilledQty"]
},
then: "fulfilled",
else: "$$item.status"
}
}
}
]
}
}
}
}
}
]);

我使用了 switch 语句,因为在我的用例中我有多个不同的 EAN。缺点是我必须使用 $map 操作,所以它总是遍历整个 items 数组。

关于MongoDB 4.2 将聚合管道更新与数组过滤器相结合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59197272/

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