我有一个名为A的集合,其中有一个产品数组, 我有一个集合B,它也有一个产品数组,通过_id,A和B关系是一对多的,对于A中的每个文档,B中可能有多个文档,而且B的产品数组仅包含A的产品中的产品数组。
这是收藏集A
{
"_id": "abcdefg",
"products": [
{
"_id": "1",
"_product": "1",
"quantity": 12
},
{
"_id": "2",
"_product": "2",
"quantity": 32
},
{
"_id": "3",
"_product": "3",
"quantity": 12
}
]
}
这是B中的两个文档 Doc 1
{
"_id": "<<obj_id>>",
"A_id":"abcdefg",
"products": [
{
"_id": "<<_id>>",
"_product": "1",
"quantity": 6
},
{
"_id": "<<_id>>",
"_product": "2",
"quantity": 16
}
]
}
和DOC 2
{
"_id": "<<obj_id>>",
"A_id":"abcdefg",
"products": [
{
"_id": "1",
"_product": "1",
"quantity": 6
},
{
"_id": "2",
"_product": "2",
"quantity": 12
},
{
"_id": "3",
"_product": "3",
"quantity": 8
}
]
}
现在,我需要一种流水线/策略,在该流水线/策略中,我可以得到A的产品数量与(所有B'的产品之和)数量之差,其中产品的ID相等,即类似
[
0,
4,
4
]
答案 0 :(得分:0)
经过2个小时的磨削,终于使其以某种方式起作用。
db.collectionb.aggregate([
{
$unwind: "$products"
},
{
$lookup:{
from:"collectiona",
localField:"A_id",
foreignField:"_id",
as:"colaref"
}
},
{
$unwind: "$colaref"
},
{
$unwind:"$colaref.products"
},
{
$project:{
colaProducts:"$colaref.products",
products:"$products",
idEq:{ $eq:["$colaref,products._id","$products._id"]}
}
},
{
$match:{
idEq: true
}
},
{
$project:{
quantity:{
$subtract:["$colaProducts.quantity","$products.quantity"]
}
}
}
])
如果我为CollectionB文档ID添加一个匹配项,那么我会得到想要的东西。