组通过在mongoid/mongodb的
问题描述:
单位的has_many StationInstances组通过在mongoid/mongodb的
StationInstance belongs_to的单元
我通过在mongoid UNIT_ID要组站的实例。
根据unit_id获得所有站点实例的查询是什么?
答
您可以直接使用group(内部为map缩减)方法在mongo中执行此操作,就像您在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函数中,您可以按unit_ StationInstance的ID(因为它属于unit,它将有unit_id),并通过count来聚合它。因为普通的计数不返回整个对象,我们明确地返回的StationInstance
reduce = function(k, values) {
var result = {count: 0, StationInstance: []};
values.forEach(function(value) {
result.count += value.count;
result.StationInstance.push(value.StationInstance);
});
return result;
}
的ID(或只是this
任何领域或整个对象),并在降低再算上分组项目,并把StationInstances到一个数组
最后发出
db.StationInstance.mapReduce(map,reduce,{out: { inline : 1}})
将返回所希望的结果
在01做到这一点,只是stringfiy
功能映射&减少和使用它像
StationInstance.collection.mapreduce(map,reduce,{:out => {:inline => 1},:raw=>true })
它有一些调整工作。但是不清楚'{:inline => 1}'和':raw => true'的作用是什么? – Autodidact 2012-01-05 09:48:48
@Millisami,inline是reduce的输出选项,意思是它告诉mongo在内存中执行时不会创建任何临时集合,如果数据很小,则适合它。检查链接以获取更多信息http://www.mongodb.org/display/DOCS/MapReduce#MapReduce-Outputoptions – RameshVel 2012-01-05 13:35:29
在map函数中,我们将'unit_id'发送为'emit(this.unit_id,{count:1 ,StationInstance:this._id});'如果,而不是'this.unit_id',我想要获得单元的文件模型中的标题? – Autodidact 2012-01-06 05:12:25