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

count the subdocument field and total amount in mongodb

我 collection 有以下文件:

{
    "_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 aggregation pipeline is available to solve your problem. You get details out of an array my processing with $unwind and then using $group 至 "sum" 总数:

db.collection.aggregate([
    // Unwind the array to de-normalize as documents
    { "$unwind": "$details" },

    // Group on the key you want and provide other values
    { "$group": { 
        "_id": "$details.itemcode",
        "itemname": { "$first": "$details.itemname" },
        "totalprice": { "$sum": "$details.price" },
        "totalqty": { "$sum": "$details.qty" }
    }}
])

理想情况下,您希望其中有一个 $match 阶段,以便首先过滤掉任何不相关的数据。这基本上是 MongoDB 查询并采用所有相同的参数和运算符。

这里大部分真的很简单。 $unwind 有点像 SQL 中的 "JOIN" 除了在嵌入式结构中已经创建了 "join",所以你只是 "de-normalizing" 就像一个连接将在 "one to many" table 关系之间进行,但仅在文档本身内进行。它基本上 "repeats" "parent" 将每个数组成员的数组文档部分作为一个新文档。

然后 $group 键起作用,如 "GROUP BY",其中 "key" 是 _id 值。 "distinct" 所有其他值都由 "grouping operators".

收集

这就是 $first 之类的操作的用武之地。如手册页所述,这会从前面 "key" 中提到的 "grouping boundary" 中获取 "first" 值.您想要这个是因为该字段的所有值 "likely" 都相同,因此选择 "first" 匹配是合乎逻辑的选择。

最后是 $sum 分组运算符,它可以完成预期的工作。 "key" 下的所有提供值是 "added" 或 "summed" 一起提供总数。就像 SQL SUM().

另请注意,所有 $ 前缀名称都是聚合框架如何处理当前正在处理的文档中 "field/property" 名称的变量。 "Dot notation" 用于引用嵌套在父 属性 名称中的嵌入式 "fields/properties"。

在MongoDB中学习聚合很有用。对于一般查询,基本 "SELECT" 语句之外的任何内容对于 SQL 都是什么。不仅用于 "grouping",还用于其他操作。

如果您对 SQL 有一定的了解,请阅读文档中所有 aggregation operators and also take a look a SQL to Aggregation Mapping 的文档作为一般指南。它有助于解释概念并展示一些可以完成的事情。