MongoDB:如何在原始命令

时间:2015-05-04 18:35:59

标签: mongodb

鉴于以下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"}}
 ] 

})

......但它没有用。

1 个答案:

答案 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 }
]