2016-04-14 8 views
1

私は1000sレコードからデータベースからデータを取得するロジックを探しています。私はアプリケーションレベルで行うことはできません。MongoDB正規表現での配列検索

私は、 "ll、gg、ss、ff ..."のように2つのツイン文字で終了するデータを持っています。 DBから上記の双子文字で終わる単語を検索したい。

マイサンプルDB:

[{ 
    "word": "Floss" 
    }, { 
    "word": "smacx" 
    }, { 
    "word": "fuzz" 
    }, { 
    "word": "grass" 
    }, { 
    "word": "dress" 
    }, { 
    "word": "puff" 
    }, { 
    "word": "cliff" 
    }, { 
    "word": "sniff" 
    }, { 
    "word": "chess" 
    }, { 
    "word": "kiss" 
    }, { 
    "word": "fell" 
    }, { 
    "word": "shell" 
    }] 

checkarray = [ 'LL'、 'G-G'、 'LL'、 'SS']。

これをDBレベルとしてどのように行うかに関するアイデア。アプリケーションレベルのループは、ほぼ100,000レコードがあるため、高くなり、時間がかかります。

答えて

2

あなたはできるuse the $in with regular expression次のように$in式で使用するRegExpオブジェクトの新しい配列を作成することによって:

var checkarray = ['ll','gg','ll','ss'], 
    regex = checkarray.map(function (k) { return new RegExp(k); }); 
db.collection.find({ 
    "word": { "$in": regex } 
}) 

をクマを念頭に置いて$inを使用すると、小さなアレイと、かなり効率的であることインデックス内をスキップして一致するドキュメントを探したり、使用するインデックスがない場合はコレクション全体を処理したりするので、巨大なリストではあまりうまくいかないでしょう。

var checkarray = ['ll','gg','ll','ss'], 
    regex = checkarray.join("|"); 
db.collection.find({ 
    "word": { 
     "$regex": regex, 
     "$options": "i" 
    } 
}) 

最後の2つの文字を一致させるには、使用:


using the $in with the regular expressionのほかに、あなたはこのようcheckarrayを含むパイプで区切られた正規表現パターンで$regex演算子を使用することができますパターンに続いて、$をパターンに追加します。ここで、$メタ文字は文字列の最後を表します。たとえば、abc$のパターンは、次のabc, endsinabc, 123abc, ...と一致します。

だから、あなたのフォローアップの質問

のために私は真ん中ない で、checkArrayの文字の終了または開始された言葉を必要としています。 CheckArray文字は、文字列の末尾に でなければなりません。

db.test.insert([ 
    { "_id": 1, "word" : "well" }, 
    { "_id": 2, "word" : "filled" }, 
    { "_id": 3, "word" : "glass" }, 
    { "_id": 4, "word" : "blessed" } 
]) 

上記:テストコレクションにこれらのサンプル文書を取り込む、これをテストするために

var checkarray = ['ll','gg','ff','ss'], 
    regex = checkarray.map(function (k) { return new RegExp(k+'$'); }); 
db.collection.find({ 
    "word": { "$in": regex } 
}) 

: "EGG" は、あなたがこのようにそれについて行くことができ

を "FILLED" ではないようなクエリは、_idの1と3のドキュメントを返します。

{ "_id" : 1, "word" : "well" } 
{ "_id" : 3, "word" : "glass" } 
+0

驚くばかり。うまく働いてくれてありがとうございます。小さな変化。途中でcheckArrayの手紙が終わる単語が必要です。 CheckArray文字は、文字列の末尾にある必要があります。 "EGG"のように "埋まっていない"、助けを探しています。@chridam –

+0

@ user1099855私は、その要件の解決策で自分の答えを更新しました。 – chridam

+0

パーフェクト、働き罰金 –