返回符合子查询结果集的文档

时间:2018-05-04 12:36:46

标签: mongodb mongodb-query aggregation-framework

我正在尝试解决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。

1 个答案:

答案 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;然后加入。