数字のグループを一意の単語として検索するには、2 つの解決策があります。
1) $text 演算子とテキスト インデックスを使用する
2) $regexp 演算子または正規表現を使用します。
設定:
db = connect("test"); // same as `use test;`
db.a.drop();
db.a.insert([
{ _id: 1, txt : "Log 1: Page 23 1234 45676" },
{ _id: 2, txt : "Log 2: Page 45 0000 00000" },
{ _id: 3, txt : "Log 3: Page 59 1337 11111" }
]);
1. $text 演算子の使用例
検索可能なフィールドにインデックスを付ける
db.a.ensureIndex({ txt : "text" });
$text 演算子を使用したクエリ
db.a.find({ $text : { $search : "45" } });
出力
{ _id: 2, txt : "Log 2: Page 45 0000 00000" }
が含まれていても、出力は _id 1 のドキュメントを返さないことに注意してください45676
。
2. 正規表現を使った例
正規表現の場合\b
、文字列内で数値が一致しないように、数値を単語境界でラップする必要があります。
4
例:単語境界なしで検索する。
/4/.test("4") == true
/4/.test("1234") == true
4
単語境界で検索しています。
/\b4\b/.test("4") == true
/\b4\b/.test("1234") == false
正規表現を使用して 45 を検索します
db.a.find({ txt : /\b45\b/ });
出力
{ _id: 2, txt : "Log 2: Page 45 0000 00000" }
次の関数を使用して、ユーザーの入力から正規表現を作成できます。
function escapeRegExp(str) {
return String(str).replace(/[[\]/{}()*+?.\^$|-]/g, "\\$&");
}
function wordToRegExp( query ){
return new RegExp( "\\b" + escapeRegExp( query ) + "\\b" );
}
var queryForWord = wordToRegExp( 45 );
// queryForWord would be sent from your server side, not created in mongo shell.
db.a.find({ txt : queryForWord });
より詳しい情報: