我有这样的收藏 订单:
{ "_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的新手,尚未找到解决方法。
答案 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"
]
}
}
])
测试:
样品收集:
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
}
]
}
]