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

时间:2015-01-07 13:28:22

标签: mongodb mongodb-query aggregation-framework

我收集了以下文件:

{
    "_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

1 个答案:

答案 0 :(得分:2)

MongoDB aggregation pipeline可用于解决您的问题。您可以使用$unwind$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有点像" JOIN"在SQL中,除了在嵌入式结构中," join"已经制作好了,所以你只是“正常化”#34;就像一个加入会在"一对多"之间进行表关系,但只是在文档本身。它基本上是"重复" "父母"将每个数组成员的数组部分记录为新文档。

然后$group工作的一个键,如" GROUP BY",其中"键"是_id值。那里的一切都是" distinct"所有其他值都由"分组运算符"。

收集

这就是像$first这样的操作进来的地方。如手册页所述,这需要"首先"来自"分组边界的值"在" key"中提到早。你想要这个,因为这个字段的所有值都是"可能"是相同的,所以这是一个合理的选择,只需选择"首先"匹配。

最后,有$sum分组运算符可以完成预期的操作。所有提供的值都在"键"是"添加"或者"总结"共同提供一个。就像SQL SUM()

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

学习MongoDB中的聚合很有用。通常会查询除了基本" SELECT"之外的任何内容。语句是SQL。不只是为了"分组"但也适用于其他操纵。

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