2016-12-05 3 views
0

600.000個のドキュメントを含む膨大なコレクションがあります。不幸にも、私は見つけたいと思う重複があります。 これらの重複は、最初の文字の大文字/小文字のみが異なります。MongoDB:DB内のすべての大文字/小文字の重複を見つける

{ 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はあまり好きではありません。これらの文字列が長すぎない(すなわち、本ではない)と仮定すると、それらの文字列はすべてメモリに収まる必要があります。 1文書につき平均80文字(1行〜端末数)で、わずか48MBです。したがって、私はデータベースクライアントにそれらのすべてをロードし、メモリ内で処理することをお勧めします。これはMongo(DB側の関数)でも行うことができますが、データベース全体をブロックします。また、map/reduceを試すこともできますが、もっと複雑な解決策に見えます。私はあなたが持っているすべての選択肢だと思う。 – freakish

+0

すべてのエントリが実際に小さい(avrg 10〜20文字)ので、正常なjavascriptの質問になり、配列から重複を取り除くことができます。 – user3142695

答えて

0

MongoDBには、使用できる$toLower変換があります。ここで

(あなたのコレクションの名前でdb.collectionを変更する必要がある)毎に1回以下のキー登場する複数の出力への道である:

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は1

よりgreated cntとのものだけを保持したまま、それらの結果をフィルタリングmongoシェルのために。あなたはjavascript(mongodbドライバを使用)からほぼ同じことをすることができますが、$groupのような引用符を付ける必要があります。

+0

この例は間違っています – sergiuz

+1

コピーして貼り付けて間違ったフィールドを変更しました...修正しました。ごめんなさい。 – Derlin

関連する問題