如何统计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]是获得成功的方法。请投票选出有助于你(不仅仅是我的):)的答案。当我获得声誉时,这些答案会起作用