分组在mongoid / mongodb

时间:2012-01-02 09:24:31

标签: mongodb group-by mongoid

单位has_many StationInstances

StationInstance belongs_to unit

我想通过mongoid中的unit_id对电台实例进行分组。

获取按unit_id分组的所有电台实例的查询是什么?

1 个答案:

答案 0 :(得分:1)

您可以使用mongo中的group(内部地图缩小)方法直接执行此操作,就像在sql中一样。代码是

  db.StationInstance.group({key:{unit_id:true},
                            cond:{},
                            reduce:function(a,b){b.sum++;},
                            initial:{sum:0}});

这将仅返回计数

>> [ { "unit_id" : xxxx, "sum" : 1 }, { "unit_id" : zzzzz, "sum" : 2 } ]

但是你无法获得StationInstance项目

相反,您可以使用MongoDB map-reduce执行此操作。请查看以下代码

map = function() { 
    emit(this.unit_id,{count:1,StationInstance:this._id}); 
}

在map函数中,您可以按StationInstance的unit_id进行分组(因为它属于unit,它将具有unit_id),并按count聚合。因为普通计数不返回整个对象,所以我们显式返回StationInstance的id(或者只是this的任何字段或整个对象)

reduce = function(k, values) {
    var result = {count: 0, StationInstance: []};
    values.forEach(function(value) {
        result.count += value.count;
        result.StationInstance.push(value.StationInstance);
    });
    return result;
}

并在reduce中我们计算分组项目,并将StationInstances放入数组

最后发出

 db.StationInstance.mapReduce(map,reduce,{out: { inline : 1}})

将返回所需的结果

mongoid中执行此操作,只需stringfiy功能图&减少并使用它

StationInstance.collection.mapreduce(map,reduce,{:out => {:inline => 1},:raw=>true })