鉴于以下mongo命令......
db.runCommand({
"aggregate":"orders","pipeline":[
{"$match":{"state.value":"open"}},
{"$group":{"_id":"$currency","total":{"$sum":"$amount"}}}
]
})
...我得到了这个结果:
{
"result" : [
{ "_id" : "USD", "total" : 55 },
{ "_id" : "EUR", "total" : 30 }
],
"ok" : 1
}
在结果中,是否可以使用currency
代替_id
?
修改
...或更好的事件,是否可以使用_id
的值作为total
的名称?
{
"result" : [
{ "USD" : 55 },
{ "EUR" : 30 }
],
"ok" : 1
}
我试过这个......
db.runCommand({
"aggregate":"orders",
"pipeline":[
{"$match":{"state.value":"open"}},
{"$group":{"_id":"$currency","total":{"$sum":"$amount"}}},
{"$project":{"_id":0,"$_id":"$total"}}
]
})
......但它没有用。
答案 0 :(得分:1)
您应该在$project
管道阶段之后添加$group
运算符阶段,并且您的最终聚合命令应该是:
db.runCommand({
"aggregate":"orders",
"pipeline":[
{"$match":{"state.value":"open"}},
{"$group":{"_id":"$currency","total":{"$sum":"$amount"}}},
{
"$project":{
"_id":0,
"currency":"$_id",
"total": 1
}
}
]
})
这会取消_id
字段并将其替换为所需的currency
字段以提供输出:
{
"result" : [
{ "currency" : "USD", "total" : 55 },
{ "currency" : "EUR", "total" : 30 }
],
"ok" : 1
}
- 更新 -
为了解决您的其他查询,MongoDB的聚合框架没有可以将字段值转换为键的$project
操作。作为解决方法,您可以尝试使用forEach()
光标方法转换聚合结果,以迭代投影字段,并在结果对象上使用JavaScript的 bracket-notation 然后创建所需的最终对象:
var pipeline = [
{"$match":{"state.value":"open"}},
{"$group":{"_id":"$currency","total":{"$sum":"$amount"}}}
],
agg = db.orders.aggregate(pipeline),
obj = {},
result = [];
agg.forEach(function (doc){
obj[doc._id] = doc.total;
result.push(obj);
});
自定义结果数组的输出:
[
{ "USD" : 55 },
{ "EUR" : 30 }
]