组通过在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 }) 
+0

它有一些调整工作。但是不清楚'{:inline => 1}'和':raw => true'的作用是什么? – Autodidact 2012-01-05 09:48:48

+0

@Millisami,inline是reduce的输出选项,意思是它告诉mongo在内存中执行时不会创建任何临时集合,如果数据很小,则适合它。检查链接以获取更多信息http://www.mongodb.org/display/DOCS/MapReduce#MapReduce-Outputoptions – RameshVel 2012-01-05 13:35:29

+0

在map函数中,我们将'unit_id'发送为'emit(this.unit_id,{count:1 ,StationInstance:this._id});'如果,而不是'this.unit_id',我想要获得单元的文件模型中的标题? – Autodidact 2012-01-06 05:12:25