Ну, вы могли бы сделать "$lookup"
на основе "InvoiceID"
и сразу $unwind
результатов, на случай, если речь идет о достаточно больших результатах документа, которые могут фактически нарушает лимит BSON;
db.Invoice_Details.aggregate([
{ "$group": {
"_id": "$InvoiceID",
"balance": { "$sum": "$TransactionAmount" }
}},
{ "$match": { "balance": { "$ne": 0 } } },
{ "$lookup": {
"from": "Invoice_Details",
"localField": "_id",
"foreignField": "InvoiceID",
"as": "details"
}},
{ "$unwind": "$details" },
{ "$replaceRoot": { "newRoot": "$details" } }
])
В идеале вы должны $replaceRoot
здесь, чтобы просто продвинуть поле со всеми результатами в корень документа. В противном случае используйте $project
и назовите все поля, если ваша версия MongoDB меньше 3.4 и не имеет стадии конвейера:
{ "$project": {
"_id": "$details._id",
"InvoiceID": "$details.InvoiceID",
"CustomerID": "$details.CustomerID",
"TransactionDate": "$details.TransactionDate",
"TransactionAmount": "$details.TransactionAmount"
}}
Но, по сути, выполнение "$lookup"
здесь фактически является «подзапросом» и условием соединения для "InvoiceID"
, просто MongoDB представляет его в другом порядке. Так что «последовательно», как «сначала агрегат», затем присоединяйтесь.