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



我有两个集合:

{
"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,则产品的可用性为"1";缺货";。所有商店都需要最低库存量(MinQty(。

我使用查找、展开和再次连接未绑定的数据来完成此操作。

有没有一种简单的方法可以使用$cond迭代第一个集合中的Stock来做到这一点:

如果我理解正确,您可以尝试以下查询:

  • 第一个CCD_;加入";字段乘以CCD_ 5值
  • 然后一个$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"
}
}
}
}
])

示例

最新更新