2012-12-26 29 views
1

我想使用聚合框架來組合很多字符串來識別唯一的字符串。我還必須保留一些關於其他領域的信息。這可能類似於我在一個group by語句中使用mysql中的*運算符。MongoDB,通過聚合框架使用組來獲得唯一的字符串

SELECT * 
FROM my_table 
GROUP BY field1 

我已經嘗試過使用聚合框架,它工作得很好,只是爲了獲得唯一的字段。

db.mycollection.aggregate({ 
    $group : { _id : "$field1"} 
    }) 

如果我想要其他字段,那該怎麼辦? MySQL只會給我第一個出現在組中的(我很好)。那就是我認爲的第一個運營商所做的。

db.mycollection.aggregate({ 
    $group : { 
     _id : "$field1", 
     another_field : {$first : "$field2"} 
    }}) 

這樣它按字段1進行分組,但仍然使我回到附加到文檔的其他字段。當我嘗試這個,我得到:

exception: aggregation result exceeds maximum document size (16MB) 

我有一種感覺是因爲它是作爲一個文件返回整個聚合。我可以將它作爲另一個json數組返回嗎?

在此先感謝

+0

http://stackoverflow.com/questions/15307800/mongodb-single-document-size-limit-is-16mb –

回答

3

你做正確的聚集,但隨着錯誤消息表明,該aggregate調用的全result不能大於16 MB。

解決方法是添加篩選器以減小結果的大小,或者使用map-reduce來替代,並將結果輸出到另一個集合。

+0

請小心,在採取第一個元素之前需要進行排序:htt p://docs.mongodb.org/manual/reference/aggregation/first/#grp._S_first –

1

另一種方法是使用distinct功能:

db.mycollection.distinct('field1') 

此函數接受第二個參數,查詢,在那裏你可以過濾的文件。

+0

這很方便,但不能解決使用不同文檔返回所有其他字段的問題。 – jwillis0720

+0

對不起,我沒有意識到這個要求。由於結果太大,您可以使用$ skip和$ limit管道對結果進行分區。這裏的權衡是,您需要多次運行聚合並以編程方式合併結果。 –

2

如果你唯一結果的值不超過2000可以使用組()函數一樣

db.mycollection.group({key : {field1 : 1, field2 : 1}}, reduce: function(curr, result){}, initial{} }) 

最後的選擇將是地圖減少:

db.mycollection.mapReduce(function() { emit({field1 :1, field2: 1}, 1); }, function(key, values) { return 1;}, {out: {replace: "unique_field1_field2"}}) 

,你的結果將是「unique_field1_field2」集合