Mongodb 返回满足子查询结果集的文档
我正在尝试解决一个问题,在Sql Server中需要一个公共表表达式或子查询 我有一个名为Invoice\u Details的集合。每个文档都有一个InvoiceID、CustomerID、TransactionDate和TransactionMount字段 我要做的是返回所有文档,当TransactionMount被聚合时,这些文档不等于零 我的分组如下:Mongodb 返回满足子查询结果集的文档,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我正在尝试解决一个问题,在Sql Server中需要一个公共表表达式或子查询 我有一个名为Invoice\u Details的集合。每个文档都有一个InvoiceID、CustomerID、TransactionDate和TransactionMount字段 我要做的是返回所有文档,当TransactionMount被聚合时,这些文档不等于零 我的分组如下: db.Invoice_Details.aggregate( [ { $group:
db.Invoice_Details.aggregate(
[
{
$group:
{
_id: { InvoiceID: "$InvoiceID"},
Balance: { $sum: "$TransactionAmount"}
}
},
{ $match: { Balance: { $ne: 0 } } }
]
)
这就产生了
{
"_id" : {
"InvoiceID" : "234904"
},
"Balance" : 182.67
}
。。。。数以百计的额外文件,这是伟大的
我现在要做的是获取聚合中返回的所有发票详细信息文档
在Sql Server中,我会重新连接公共表表达式/子查询的结果,但我不确定如何(如果?)执行mongo。您可以基于“InvoiceID”
立即执行一个操作,并立即执行结果,以防我们讨论的文档结果足够大,实际上可能会违反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" } }
])
理想情况下,您可以在这里简单地将包含所有结果的字段提升到文档根目录中。否则,如果您的MongoDB版本低于3.4且缺少管道阶段,请使用并命名所有字段:
{ "$project": {
"_id": "$details._id",
"InvoiceID": "$details.InvoiceID",
"CustomerID": "$details.CustomerID",
"TransactionDate": "$details.TransactionDate",
"TransactionAmount": "$details.TransactionAmount"
}}
但本质上,这里执行的是
“InvoiceID”
上的“子查询”和连接条件,只是MongoDB以不同的顺序显示它。所以“顺序”为“聚合优先”,然后加入。这样做是可行的,但即使在只有529442个文档的集合中,它也超时了。第一部分(在查找之前)运行大约5秒钟。是我在这里采取了完全错误的方法,还是这是一种可以理解的缓慢的事情?@MillinMo在InvoiceID
的开头添加一个$sort
阶段。在现实世界中,你很可能首先会有一个日期范围的$match
。最重要的是,不要在Robo3T中运行。它真的是一个坏软件,不支持MongoDB。使用mongo shell,因为它可以正常工作。模仿SQL是错误的方法吗?几乎可以肯定,但如果不重新设计,这基本上就是你所拥有的