在更新中使用 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]

Test code here

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'
}}]