2013-09-16 52 views
1

從一個集合中獲取基於單個字段的唯一文檔的最簡單方法是什麼?Mongo找到唯一的結果

我知道我可以使用db.collections.distrinct來獲得一個字段的所有不同值的數組,但我想爲每個不同的字段的值獲得第一個(或真正的任何一個)文檔。

例如如果數據庫包含:

{number:1, data:'Test 1'} 
{number:1, data:'This is something else'} 
{number:2, data:'I'm bad at examples'} 
{number:3, data:'I guess there\'s room for one more'} 

它將返回(基於number是唯一的:

{number:1, data:'Test 1'} 
{number:2, data:'I'm bad at examples'} 
{number:3, data:'I guess there\'s room for one more'} 

編輯:我要補充一點,在服務器運行蒙戈2.0.8所以沒有聚集,有更多的結果比組將支持。

+1

升級到2.4,並使用聚合:) – Philipp

+0

使用「獨特」查詢 –

+0

您可能會發現彙總結果,即使他們支持你正在使用的版本,可能不支持您需要的結果集的大小。 – WiredPrairie

回答

2

更新到2.4,並使用聚集:)

當你真正需要堅持舊版本的MongoDB由於過於重d磁帶,您可以使用MapReduce

在MapReduce中,映射函數將集合中的每個文檔轉換爲一個新文檔和一個區別鍵。 reduce函數用於將具有相同特定鍵的文檔合併爲一個。

您的地圖功能將按原樣發出您的文檔並將數字字段作爲唯一鍵發送。它應該是這樣的:

var mapFunction = function(document) { 
     emit(document.number, document); 
} 

您減少功能接收的文件陣列使用相同的密鑰,並且應該以某種方式把它們變成一個文檔。在這種情況下,它只是丟棄所有,但第一個文檔使用相同的密鑰:

var reduceFunction = function(key, documents) { 
    return documents[0]; 
} 

不幸的是,MapReduce的存在一些問題。它不能使用索引,因此至少要爲集合中的每個單獨文檔執行兩個JavaScript函數(可以通過使用mapReduce命令的query-argument預先排除某些文檔來限制它)。當你有大量的收藏時,這可能需要一段時間。您也無法完全控制如何形成由MapReduce創建的文檔。它們總是有兩個字段,分別是_id和密鑰value以及您爲密鑰返回的文檔。

MapReduce也很難排除故障。

TL;博士:更新到2.4

+0

感謝您爲我設置mapreduce。聽起來我仍然需要做一些後處理來重新格式化返回的文檔。升級肯定是在待辦事項列表中。 –