2016-12-05 53 views
0

有600.000個文檔的巨大集合。不幸的是有重複的,我想找到。 這些重複僅在首字母大寫/小寫字母之間有所不同。MongoDB:查找數據庫中的所有低/大寫副本

{ key: 'Find me' }, 
{ key: 'find me' }, 
{ key: 'Don't find me }, // just one document for this string 
{ key: 'don't find me either } // just one document for this string 

現在我想要得到所有重複,這意味着存在一個大寫字母和小寫字符串。

+0

600k看起來不是很多。假設這些字符串不太長(即不是書),它們都應該適合內存。平均每個文件80個字符(在終端中一行)只有〜48Mb。因此,我建議將它們全部加載到數據庫客戶端並在內存中進行處理。它也可以用Mongo來完成(db端函數),但它會阻塞整個數據庫。你也可以嘗試map/reduce,但它似乎是更復雜的解決方案。我認爲這是你所有的選擇。 – freakish

+0

聽起來不錯,因爲每個條目都非常小(avrg 10-20個字符),那麼從數組中獲取重複數據將是一個正常的javascript問題。 – user3142695

回答

0

在MongoDB中,有一個可用的$toLower轉換。

這裏有一個方法來出現一次以上(你需要通過你的集合名稱變更db.collection)輸出的每個鍵:

db.collection.aggregate([ 
    { $group: 
     { 
      _id: { $toLower: "$key" }, 
      cnt: { "$sum": 1 } 
     } 
    }, 
    { $match: 
     { cnt: {$gt: 1 } } 
    } 
]) 

首先,$groups組的文件由key(不區分大小寫) 。每個密鑰的文檔數量累計在cnt。對於$group之後,你最終的東西,如:

{"key": "find me", "cnt": 2} 
{"key": "other key", "cnt": 1} 
... 

然後,$match過濾這些結果,只保留與greated比1

注意一個cnt的那些:上面是代碼爲蒙戈殼。您可以使用JavaScript(使用mongodb驅動程序)完成相同的操作,但您需要在$group等附近添加引號。

+0

這個例子不正確 – sergiuz

+1

我複製粘貼並更改了錯誤的字段......修正了它。抱歉。 – Derlin

相關問題