2012-01-02 138 views
2

單位的has_many StationInstances組通過在mongoid/mongodb的

StationInstance belongs_to的單元

我通過在mongoid UNIT_ID要組站的實例。

根據unit_id獲得所有站點實例的查詢是什麼?

回答

1

您可以直接使用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