在更新中使用 mongodb 字段值来获取外部数组的索引?
Using mongodb field values in update to get an index of an external array?
这里是 mongodb 开发新手。我正在尝试编写一个更新查询,在其中搜索某些产品的库存并根据销售的产品数量减少数量。我有一个产品列表,它是一个对象列表,它包含正在销售的产品。
products= [
{
product: "*some product id*",
quantity: "*some quantity*"
}
]
我将上述列表中的产品 ID 提取到 productIds 列表中。
下面是我的查询的样子。我已经意识到我无法将“$product”[股票的一个字段] 传递到 indexof() 中,有没有办法通过聚合管道使用更新来处理这个问题?如果没有,我还有什么其他选择?我搜索了文档,但找不到任何有用的信息。
Stock.updateOne(
{
product: { $in: productIds },
quantity: { $gt: 0 },
},
[
{
$set: {
newQuantity: {
$subtract: [
"$quantity",
products[productIds.indexOf("$product")].quantity,
],
},
},
},
],
);
查询
$reduce
找到要减去的数量
- listQuantity 将是那个数量,产品与列表的产品进行比较,如果匹配,我们得到数量(作为减少结果)
- 而不是
"input": [{"product":1, "quantity":3}, {"product":2, "quantity":4}]
使用 "input": YOUR_JS_ARRAY_VARIABLE
- 然后从之前的数量中减去这个数量
- productIds 只能是本例中的
[1,2]
Stock.update(
{
"product": { "$in": productIds },
"quantity": { "$gt": 0 },
}
,
[{"$set":
{"listQuantity":
{"$reduce":
{"input":
[{"product":1, "quantity":3}, {"product":2, "quantity":4}],
"initialValue":-1,
"in":
{"$cond":
[{"$and":
[{"$eq":["$$value", -1]},
{"$eq":["$$this.product", "$product"]}]},
"$$this.quantity", "$$value"]}}}}},
{"$set":
{"quantity":
{"$cond":
[{"$eq":["$listQuantity", -1]}, "$quantity",
{"$subtract":["$quantity", "$listQuantity"]}]},
"listQuantity":"$$REMOVE"}}])
这是我用来编写查询的订单集合数据集的示例
{
"name" : "Order 2",
"products" : [
{"idProduct" : "61c5ec036d9383e03e62d8ae" , "quantity" : 6 },
{"idProduct" : "61c5ebee6d9383e03e62d8ac" , "quantity" : 2 } ]
}
这是我在订单集合上的汇总,用于更新产品集合上的产品
[{$unwind: {
path: "$products"
}}, {$lookup: {
from: 'Product',
localField: 'products.idProduct',
foreignField: '__id',
as: 'productsToAdjust'
}}, {$unwind: {
path: "$productsToAdjust"
}}, {$set: {
"productsToAdjust.quantity": { $subtract :["$productsToAdjust.quantity","$products.quantity"] }
}}, {$replaceRoot: {
newRoot: "$productsToAdjust"
}}, {$merge: {
into: 'Product',
on: '__id',
whenMatched: 'merge',
whenNotMatched: 'fail'
}}]
这里是 mongodb 开发新手。我正在尝试编写一个更新查询,在其中搜索某些产品的库存并根据销售的产品数量减少数量。我有一个产品列表,它是一个对象列表,它包含正在销售的产品。
products= [
{
product: "*some product id*",
quantity: "*some quantity*"
}
]
我将上述列表中的产品 ID 提取到 productIds 列表中。 下面是我的查询的样子。我已经意识到我无法将“$product”[股票的一个字段] 传递到 indexof() 中,有没有办法通过聚合管道使用更新来处理这个问题?如果没有,我还有什么其他选择?我搜索了文档,但找不到任何有用的信息。
Stock.updateOne(
{
product: { $in: productIds },
quantity: { $gt: 0 },
},
[
{
$set: {
newQuantity: {
$subtract: [
"$quantity",
products[productIds.indexOf("$product")].quantity,
],
},
},
},
],
);
查询
$reduce
找到要减去的数量- listQuantity 将是那个数量,产品与列表的产品进行比较,如果匹配,我们得到数量(作为减少结果)
- 而不是
"input": [{"product":1, "quantity":3}, {"product":2, "quantity":4}]
使用"input": YOUR_JS_ARRAY_VARIABLE
- 然后从之前的数量中减去这个数量
- productIds 只能是本例中的
[1,2]
Stock.update(
{
"product": { "$in": productIds },
"quantity": { "$gt": 0 },
}
,
[{"$set":
{"listQuantity":
{"$reduce":
{"input":
[{"product":1, "quantity":3}, {"product":2, "quantity":4}],
"initialValue":-1,
"in":
{"$cond":
[{"$and":
[{"$eq":["$$value", -1]},
{"$eq":["$$this.product", "$product"]}]},
"$$this.quantity", "$$value"]}}}}},
{"$set":
{"quantity":
{"$cond":
[{"$eq":["$listQuantity", -1]}, "$quantity",
{"$subtract":["$quantity", "$listQuantity"]}]},
"listQuantity":"$$REMOVE"}}])
这是我用来编写查询的订单集合数据集的示例
{
"name" : "Order 2",
"products" : [
{"idProduct" : "61c5ec036d9383e03e62d8ae" , "quantity" : 6 },
{"idProduct" : "61c5ebee6d9383e03e62d8ac" , "quantity" : 2 } ]
}
这是我在订单集合上的汇总,用于更新产品集合上的产品
[{$unwind: {
path: "$products"
}}, {$lookup: {
from: 'Product',
localField: 'products.idProduct',
foreignField: '__id',
as: 'productsToAdjust'
}}, {$unwind: {
path: "$productsToAdjust"
}}, {$set: {
"productsToAdjust.quantity": { $subtract :["$productsToAdjust.quantity","$products.quantity"] }
}}, {$replaceRoot: {
newRoot: "$productsToAdjust"
}}, {$merge: {
into: 'Product',
on: '__id',
whenMatched: 'merge',
whenNotMatched: 'fail'
}}]