我正在尝试解决Sql Server中需要公用表表达式或子查询的问题。
我有一个名为Invoice_Details的集合。每个文档都有一个InvoiceID,CustomerID,TransactionDate和TransactionAmount字段。
我要做的是获取汇总TransactionAmount时的所有文档,不等于零。
我按照以下方式进行分组:
db.Invoice_Details.aggregate(
[
{
$group:
{
_id: { InvoiceID: "$InvoiceID"},
Balance: { $sum: "$TransactionAmount"}
}
},
{ $match: { Balance: { $ne: 0 } } }
]
)
,这会产生
{
"_id" : {
"InvoiceID" : "234904"
},
"Balance" : 182.67
}
....数百个额外的文件很棒。
我现在要做的是获取聚合中返回的所有invoice_details文档。
在Sql Server中,我会重新加入公用表表达式/子查询的结果,但我不确定如何(如果?)我可以做这个mongo。
答案 0 :(得分:0)
您可以根据void Method<T>(T val) where T : unmanaged
并立即"$lookup"
结果$unwind
,以防万一我们正在讨论可能实际违反BSON限制的足够大的文档结果;
"InvoiceID"
理想情况下,您$replaceRoot
这里只需将包含所有结果的字段提升到文档根目录中。否则,如果您的MongoDB版本低于3.4且缺少管道阶段,请使用$project
并命名所有字段:
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" } }
])
但基本上在这里做"$lookup"
实际上是&#34;子查询&#34;并加入 { "$project": {
"_id": "$details._id",
"InvoiceID": "$details.InvoiceID",
"CustomerID": "$details.CustomerID",
"TransactionDate": "$details.TransactionDate",
"TransactionAmount": "$details.TransactionAmount"
}}
上的条件,只是MongoDB以不同的顺序呈现它。所以&#34;顺序&#34; as&#34;聚合第一&#34;然后加入。