问题描述
我有两个集合的一对多关系,比如 A 到 B。我如何在一个文档中为每个 id 显示所需的输出。 例如,我有
/*Collection A*/
{
"a_Id": "abc","name": "xyz","age": 5
}
...//其他文档
/*Collection B*/
{
"b_id": "abc","FeeAmount": 800000,"invoiceNumber": "A10","Date": "2021-10-29T00:00:00.000+04:00","Paidamount": 200000
},{
"b_id": "abc","FeeAmount": 90,"invoiceNumber": "A20","Paidamount": 20
}
//...其他文档多个不同的 id 例如 abc1,abc2
根据 id 查找后如何获得以下输出? 这是每个 ID 一个文档。
/*Desired OutPut*/
//Document 1
{
"name": "xyz","age": 5
"availableLimitAmount": 800000,"Paidamount": 200000
},{
"name": "xyz","age": 5
"FeeAmount": 90,"Paidamount": 20
}
//Document 2
{
"name": "qwe","age": 50
"availableLimitAmount": 20000,"FeeAmount": 40000,"invoiceNumber": "B10","Date": "2021-1-1T00:00:00.000+04:00","Paidamount": 1000
},{
"name": "qwe","age": 50
"FeeAmount": 40,"invoiceNumber": "B20","Date": "2021-2-2T00:00:00.000+04:00","Paidamount": 500
}
解决方法
这是关于如何实现这一目标的working solution。
db.coll1.aggregate([
{
$lookup: {
localField: "a_Id",from: "coll2",foreignField: "b_id",as: "data",}
},{
$unwind: "$data"
},{
$replaceRoot: {
"newRoot": {
"$mergeObjects": [
"$$ROOT","$data"
]
}
}
},{
$project: {
"data": 0
}
}
])
更新
db.coll1.aggregate([
{
$lookup: {
localField: "a_Id",{
$project: {
"data": 0
}
},{
$group: {
_id: "$a_Id",data: {
$push: "$$ROOT"
}
}
}
])
,
试试这个:
db.A.aggregate([
{
$lookup: {
from: "B",localField: "a_Id",as: "B"
}
},{ $unwind: "$B" },{
$project: {
"_id": 0,"name": "$name","age": "$age","FeeAmount": "$B.FeeAmount","invoiceNumber": "$B.invoiceNumber","Date": "$B.Date","PaidAmount": "$B.PaidAmount",}
}
]);