Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 返回满足子查询结果集的文档_Mongodb_Mongodb Query_Aggregation Framework - Fatal编程技术网

Mongodb 返回满足子查询结果集的文档

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:

我正在尝试解决一个问题,在Sql Server中需要一个公共表表达式或子查询

我有一个名为Invoice\u Details的集合。每个文档都有一个InvoiceID、CustomerID、TransactionDate和TransactionMount字段

我要做的是返回所有文档,当TransactionMount被聚合时,这些文档不等于零

我的分组如下:

   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是错误的方法吗?几乎可以肯定,但如果不重新设计,这基本上就是你所拥有的