2012-08-15 47 views
26

例如,有這樣一個集合:
如何高效地使用多個鍵執行「獨特」?

{市場: 'SH',代碼: '000001',日期: '2012-01-01',價格:1000}
{市場: 'SZ',代碼: '000001',日期: '2012-01-01',價格:1000}
{市場: 'SH',代碼: '000001',日期: '2012-01-02',價格:1000}
{市場: 'SZ',代碼: '000001',日期: '2012-01-02',價格:1000}
{市場: 'SH',代碼: '000002',日期: '2012-01-03',價格:1000}
...

此集合包含數千萬的文件。

我想打電話給不同的兩個鍵:

collection.distinct('market', 'code'); 

,並得到結果:

[{市場: 'SH',代碼: '000001'}, {市場: 'SZ',代碼: '000001'},{ 市場: 'SH',代碼: '000002'}]

本機獨特的命令只接受一個關鍵,我嘗試實施它通過使用map-reduce。但是map-reduce太慢而不是本地獨特。在我的一鍵獨特測試中,map-reduce花費的時間比native distinct長十倍。
有沒有一種有效的方法來實現multikey不同?

回答

53

如果你願意等待即將到來的2.2版本的MongoDB,您可以有效地使用聚合框架運行此查詢:

collection = db.tb; 
result = collection.aggregate( 
      [ 
       {"$group": { "_id": { market: "$market", code: "$code" } } } 
      ] 
     ); 
printjson(result); 

在我的測試機上百萬記錄收集,該跑4秒,而地圖/減少版本花費了一分鐘。

相關問題