单位has_many StationInstances
StationInstance belongs_to unit
我想通过mongoid中的unit_id对电台实例进行分组。
获取按unit_id分组的所有电台实例的查询是什么?
答案 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 })