MongoDB:使用Group获取值列表

时间:2011-11-17 02:41:57

标签: mongodb

我有一个名为contract的集合,我想group using "a_id"

{
 a_id: 1,
 "name": "n1"
}
{
 a_id: 2,
 "name": "n2"
}
{
 a_id: 1,
 "name": "n3"
}
{
 a_id: 1,
 "name": "n4"
}
{
 a_id: 2,
 "name": "n5"
}

我希望group by "a_id"向我显示相关名称列表。

{
 a_id: 1,
 values: ["n1", "n3", "n4"]
}
{
 a_id: 2,
 values: ["n2", "n5"]
}

我的代码:

db.contract.group({ 
      key:{a_id: 1}, 
      initial: {v: ''}, 
      reduce: function(doc, obj){ 
            v = v + " " + obj.name
      } 
}); 

我的输出:

{
        "a_id" : 1,
        "v" : ""
    },
    {
        "asset_id" : 2,
        "v" : ""
    }

这不会返回值列表,但 mongd logs 会显示名称列表,如何更正?

已修复

db.contract.group({
   key:{a_id: 1}, 
   initial: {v: []}, 
   reduce: function(obj, prev){ 
      prev.v.push(obj.name)
   }
});

2 个答案:

答案 0 :(得分:9)

您也可以使用MongoDB's aggregation framework

以下内容完全相同:

db.contract.aggregate({$group: { '_id': '$a_id', 'name': { $push: '$name'}}})

以下内容仅在结果集中放置一次唯一值(如果每个'a_id'有重复的名称):

db.contract.aggregate({$group: { '_id': '$a_id', 'name': { $addToSet: '$name'}}})

答案 1 :(得分:1)

已修复

db.contract.group({
   key:{a_id: 1}, 
   initial: {v: []}, 
   reduce: function(obj, prev){ 
      prev.v.push(obj.name)
   }
});