统计mongodb中的子文档字段和总金额

统计mongodb中的子文档字段和总金额,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我收集了以下文件: { "_id" : ObjectId("54acfb67a81bf9509246ed81"), "Billno" : 1234, "details" : [ { "itemcode" : 12, "itemname" : "Paste100g", "qty" : 2, "price" : 50 }, {

我收集了以下文件:

{
    "_id" : ObjectId("54acfb67a81bf9509246ed81"),
    "Billno" : 1234,
    "details" : [ 
        {
            "itemcode" : 12,
            "itemname" : "Paste100g",
            "qty" : 2,
            "price" : 50
        }, 
        {
            "itemcode" : 14,
            "itemname" : "Paste30g",
            "qty" : 4,
            "price" : 70
        }, 
        {
            "itemcode" : 12,
            "itemname" : "Paste100g",
            "qty" : 4,
            "price" : 100
        }
    ]
}

{
    "_id" : ObjectId("54acff86a81bf9509246ed82"),
    "Billno" : 1237,
    "details" : [ 
        {
            "itemcode" : 12,
            "itemname" : "Paste100g",
            "qty" : 3,
            "price" : 75
        }, 
        {
            "itemcode" : 19,
            "itemname" : "dates100g",
            "qty" : 4,
            "price" : 170
        }, 
        {
            "itemcode" : 22,
            "itemname" : "dates200g",
            "qty" : 2,
            "price" : 160
        }
    ]
}
我需要显示下面的输出。请帮忙

所需输出:

---------------------------------------------------------------------------------
itemcode           itemname               totalprice       totalqty
---------------------------------------------------------------------------------  
12                 Paste100g               225                9
14                 Paste30g                 70                4
19                 dates100g               170                4
22                 dates200g               160                2
MongoDB可以解决您的问题。您可以从数组中获取详细信息,然后使用我的处理“求和”总计:

db.collection.aggregate([
//展开数组以反规范化为文档
{“$unwind”:“$details”},
//按所需键分组并提供其他值
{“$group”:{
“_id”:“$details.itemcode”,
“itemname”:{“$first”:“$details.itemname”},
“总价”:{“$sum”:“$details.price”},
“totalqty”:{“$sum”:“$details.qty”}
}}
])
理想情况下,您需要一个阶段,首先过滤掉任何不相关的数据。这基本上是MongoDB查询,采用所有相同的参数和运算符

这里的大多数都很简单。这有点像SQL中的“连接”,不同的是在嵌入式结构中已经进行了“连接”,因此您只是在“一对多”表关系之间进行“反规范化”,而只是在文档本身中。它基本上是将每个数组成员的“父”文档部分作为新文档“重复”到数组中

然后是键的工作方式,如“分组方式”,其中“键”是
\u id
值。所有存在的值都是“不同的”,所有其他值都由“分组运算符”收集

这就是像这样的操作的用武之地。如手册页面所述,这将从前面“键”中提到的“分组边界”中获取“第一个”值。之所以需要这样做,是因为该字段的所有值“可能”都是相同的,因此选择“第一个”匹配项是合乎逻辑的

最后是分组运算符,它完成了预期的操作。将“键”下提供的所有值“相加”或“求和”在一起,以提供总计。就像SQL
SUM()
一样

还请注意,所有前缀名称都是聚合框架如何处理当前文档中“字段/属性”名称的变量。用于引用嵌套在父属性名称中的嵌入“字段/属性”

学习MongoDB中的聚合非常有用。对于一般查询来说,除了基本的“SELECT”语句之外,SQL还有什么其他功能。不仅用于“分组”,还用于其他操作


如果您对SQL有一定的了解,请通读所有的文档,并查看文档作为一般指南。它有助于解释概念并展示一些可以做的事情。

@Disposer我应该聘用你作为我的个人编辑。它是作为一个“新手”的参考,所以我添加了那个和其他缺失的信息。我真的应该写更多的博客,我也确实为MongoDB官方文档写了更多的博客,但当有人决定让实习生在这些章节中提供示例时,这一点就消失了。不知道发生了什么事。谢谢你的洞察力。这会让反应更好。谢谢你。假设我必须显示主文档中的详细信息(本例中为Billno)。如何对每个结果集显示Billno。@根由于您是跨文档分组的,因此文档唯一的任何内容都不会有与分组键匹配的唯一值。您可以使用
$first
获取“first”匹配项,或者使用
$push
形成数组,或者使用任何其他分组运算符。如果你无法解决这个问题,那么最好问另一个问题,清楚地描述你想要的结果。这里的列表根据您提供的数据样本生成所需的输出。