如何使用MongoDb聚合框架

时间:2019-12-15 13:34:38

标签: mongodb aggregation-framework

我有这样的收藏 订单:

{ "_id": 123 , 
"order" : { "orderId": 100, "name": "John Doe" }, 
"deliverTo": [ "A", "B", "C"] }

交货:

{ "_id": 456 , 
"orderId": 100, 
"deliveredTo": "A"
}

{ "_id": 457 , 
"orderId": 100, 
"deliveredTo": "B"
}

使用聚合管道$lookup,我已经到了这个阶段

{"_id": 123,
"deliverTo": [ "A", "B", "C"],
"orderDeliveries": [ 
{"_id": 457 , "orderId": 100,"deliveredTo": "B"},
{"_id": 456 , "orderId": 100, "deliveredTo": "A"}] }

它没有传递到地址C和 我该如何查询所有缺少交货的订单(可能也会得到计数,但它是可选的)?

我是MongoDb和Aggregation Framework的新手,尚未找到解决方法。

1 个答案:

答案 0 :(得分:0)

您可以像这样使用$redact聚合和$setIsSubset运算符。

db.orders.aggregate([
  {
    $lookup: {
      from: "deliveries",
      localField: "order.orderId",
      foreignField: "orderId",
      as: "orderDeliveries"
    }
  },
  {
    $redact: {
      $cond: [
        {
          $setIsSubset: [
            "$deliverTo",
            "$orderDeliveries.deliveredTo"
          ]
        },
        "$$PRUNE",
        "$$KEEP"
      ]
    }
  }
])

Mongoplayground

测试:

样品收集:

db={
  "orders": [
    {
      "_id": 123,
      "order": {
        "orderId": 100,
        "name": "John Doe"
      },
      "deliverTo": [
        "A",
        "B",
        "C"
      ]
    },
    {
      "_id": 124,
      "order": {
        "orderId": 101,
        "name": "John Doe"
      },
      "deliverTo": [
        "D",
        "E"
      ]
    }
  ],
  "deliveries": [
    {
      "_id": 456,
      "orderId": 100,
      "deliveredTo": "A"
    },
    {
      "_id": 457,
      "orderId": 100,
      "deliveredTo": "B"
    },
    {
      "_id": 458,
      "orderId": 101,
      "deliveredTo": "D"
    },
    {
      "_id": 459,
      "orderId": 101,
      "deliveredTo": "E"
    }
  ]
}

结果:

[
  {
    "_id": 123,
    "deliverTo": [
      "A",
      "B",
      "C"
    ],
    "order": {
      "name": "John Doe",
      "orderId": 100
    },
    "orderDeliveries": [
      {
        "_id": 456,
        "deliveredTo": "A",
        "orderId": 100
      },
      {
        "_id": 457,
        "deliveredTo": "B",
        "orderId": 100
      }
    ]
  }
]