使用 mongo $cond 聚合在第一次出现的值中生成一个新字段

Use mongo $cond aggregator to generate a new field in the first occurrance of a value

我有两个合集:

{
"Sku" : "A",
"Stock" : [
    {
        "StoreCode" : "1",
        "Qty" : 3
    }
 ]
},
{
"Sku" : "B",
"Stock" : [
    {
        "StoreCode" : "1",
        "Qty" : 3
    },
    {
        "StoreCode" : "2",
        "Qty" : 5
    },
    {
        "StoreCode" : "10",
        "Qty" : 7
    }
 ]
}

{
"Sku" : "A",
"MinQty" : 2
}
{
"Sku" : "B",
"MinQty" : 5
}

如何聚合这两个集合以获得以下预期输出:

{
"Sku" : "A",
"Availability" : "in stock"
}
{
"Sku" : "B",
"Availability" : "out of stock"
}

基本上,如果特定 SKU 的一家商店没有 MinQty 库存,则该产品的可用性为“缺货”。所有商店都需要有最低数量 (MinQty) 的库存。

我使用查找、展开并再次加入展开的数据来完成此操作。

有没有一种简单的方法可以使用 $cond 在第一个集合中遍历 Stock:

如果我没理解错你可以试试这个查询:

  • 首先 $lookupsku 值“加入”字段。
  • 然后一个$project阶段输出你想要的值。
  • 使用 $cond,您可以在其中添加阶段 $gte$max$min

如果我没记错的话,逻辑是:“如果 ($cond) 最小 ($min) 库存数量大于或等于 ($gte) MinQty 中的最大 ($max) 个数则为“有货”,否则为“缺货”。

db.collA.aggregate([
  {
    "$lookup": {
      "from": "collB",
      "localField": "Sku",
      "foreignField": "Sku",
      "as": "skus"
    }
  },
  {
    "$project": {
      "_id": 0,
      "Sku": 1,
      "Availability": {
        "$cond": {
          "if": {
            "$gte": [
              {
                "$min": "$Stock.Qty"
              },
              {
                "$max": "$skus.MinQty"
              }
            ]
          },
          "then": "in stock",
          "else": "out of stock"
        }
      }
    }
  }
])

示例here