Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.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_Aggregation Framework - Fatal编程技术网

如何统计Mongodb聚合中的字段

如何统计Mongodb聚合中的字段,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我有一份文件,上面有这样的条目 { "_id": ObjectId("5644c495d0807a1750043237"), "siteid": "123456" "amount": 1.32 } 有些单据有其他金额,例如“cashbackAmount” 我希望每个金额字段都有一个sum和一个count。并非每个文档都包含所有金额字段 我试过以下方法 { $group: { "_id": "$siteid", item2:

我有一份文件,上面有这样的条目

{ 
    "_id": ObjectId("5644c495d0807a1750043237"),
    "siteid": "123456"
    "amount": 1.32
}
有些单据有其他金额,例如
“cashbackAmount”

我希望每个金额字段都有一个
sum
和一个
count
。并非每个文档都包含所有金额字段

我试过以下方法

{
    $group: {   
        "_id": "$siteid",
        item2: { "$sum": "$amount" },
        item3: { "$sum": "$totalAmount" },
        item4: { "$sum": "$cashbackAmount" },
        item5: { "$sum": "$unitPrice" },
    }
}  
它给出了总和,但我无法计算出如何获得每个金额字段出现的次数


{“$sum”:1}
不起作用,因为它提供了包含任何一个总计字段的所有文档。

如果您事先知道金额字段,则可以在动态创建管道的单个聚合操作中执行此操作

查看以下演示:

var amountFields = ["amount", "totalAmount", "cashbackAmount", "unitPrice"],
    groupOperator = { "$group": { "_id": "$siteid" } };

amountFields.forEach(function (field){ 
    groupOperator["$group"][field+"Total"] = { "$sum": "$"+field }; 
    groupOperator["$group"][field+"Count"] = { 
       "$sum": {            
           "$cond": [ { "$gt": [ "$"+field, null ] }, 1, 0 ]
        }
    };
});

db.test.aggregate([groupOperator]);
填充测试文档

db.test.insert([
    { 
        "siteid": "123456",
        "amount": 1.32
    },
    { 
        "siteid": "123456",
        "cashbackAmount": 8.32
    },
    { 
        "siteid": "123456",
        "cashbackAmount": 9.74
    },
    { 
        "siteid": "123456",
        "unitPrice": 0.19
    },
    { 
        "siteid": "123456",
        "amount": 27.8,
        "totalAmount": 15.22,
        "unitPrice": 5.10,
        "cashbackAmount": 43.62    
    },
    { 
        "siteid": "123456",
        "unitPrice": 5.07
    },
    { 
        "siteid": "123456",
        "amount": 12.98,
        "totalAmount": 32.82
    },
    { 
        "siteid": "123456",
        "amount": 6.65,
        "unitPrice": 5.10
    }
])
样本聚合输出

{
    "_id" : "123456",
    "amountTotal" : 48.75,
    "amountCount" : 4,
    "totalAmountTotal" : 48.04,
    "totalAmountCount" : 2,
    "cashbackAmountTotal" : 61.68,
    "cashbackAmountCount" : 3,
    "unitPriceTotal" : 15.46,
    "unitPriceCount" : 4
}

我猜你可能想要这样的东西

db.getCollection('amounts').aggregate([
    {
        $project: {
            siteid: 1,
            amount: 1,
            totalAmount: 1,
            unitPrice: 1,
            cashbackAmount: 1,
            amountPresent: {
                $cond: {
                    if: "$amount",
                    then: 1,
                    else: 0
                }
            },
            totalAmountPresent: {
                $cond: {
                    if: "$totalAmount",
                    then: 1,
                    else: 0
                }
            },
            cashbackAmountPresent: {
                $cond: {
                    if: "$cashbackAmount",
                    then: 1,
                    else: 0
                }
            },
            unitPricePresent: {
                $cond: {
                    if: "$unitPrice",
                    then: 1,
                    else: 0
                }
            }
        }
    },
    {
        $group: {   
            "_id": "$siteid",
            amountSum:   { "$sum": "$amount" },
            amountCount: { "$sum": "$amountPresent" },
            totalAmountSum:   { "$sum": "$totalAmount" },
            totalAmountCount: { "$sum": "$totalAmountPresent" },
            cashbackAmountSum:   { "$sum": "$cashbackAmount" },
            cashbackAmountCount: { "$sum": "$cashbackAmountPresent" },
            unitPriceSum:   { "$sum": "$unitPrice" },
            unitPriceCount: { "$sum": "$unitPricePresent" }
        }
    }
])

您所说的
获取每个金额字段出现的次数是什么意思?你能给出一些预期的输出示例吗?谢谢“$cond”:[{“$gt”:[“$”+字段,null]},1,0]是获得成功的方法。请投票选出有助于你(不仅仅是我的):)的答案。当我获得声誉时,这些答案会起作用