2012-02-24 13 views
1

サイトの一部をmysqlからmongodbに移動していますが、mongodbを使用する部分は検索です。 mysqlでこのクエリを作成すると、問題が1つあります。MongoDB LIKE vs. Mysql LIKE

SELECT * FROM table WHERE a1 LIKE '%test%' OR a2 LIKE '%test%' 

10k以上の結果が得られます。それで大丈夫です。

私はモンゴ

$mongo->find(
    array(
     '$or' => array(
      array('a1' => new MongoRegex('/test/')), 
      array('a2' => new MongoRegex('/test/')) 
     ) 
    ) 
)->count(); 

でこのクエリを実行する場合は、私が約2kΩ結果、5倍少ないを取得します。どうしたの?

各データベースのデータは同じです。

+0

SQLの 'table'とMongoDBコレクションの合計レコード数は同じですか? – Phil

+0

likeiと同じDBだが、それらは全く同じで、65kレコードの両方がある – Squirll

+0

a1/2にインデックスがある場合、インデックスを効率的に使用しないことに注意してください。 –

答えて

6

MySQLのLIKE is case-insensitiveデフォルトで:

次の2つのステートメントは、オペランドの一つがバイナリ文字列でない限り、その文字列の比較では大文字と小文字は区別されていません説明:

mysql> SELECT 'abc' LIKE 'ABC'; 
    -> 1 

しかし、MongoDBのの正規表現を検索JavaScriptの正規表現では大文字と小文字が区別されるため、デフォルトで大文字と小文字が区別されます。

大文字と小文字を区別しない正規表現を使用してください。私はMongoRegexの構文に慣れていないんだけどthe fine manualはいつも/i修飾子は動作するはずと言っている:

new MongoRegex('/test/i') 

場合の問題は、MongoDBの(〜2K)よりもMySQLの(〜10K)で多くの試合を得ることと一致しています。

+0

"i"を区別しないように追加し、結果は2倍になりますが、mysqlよりもずっと小さく、36分の結果が少なくなります – Squirll

+0

@Squirll:MongoDBにはないものはありますか? –

+0

"無料のチケット"とか "チケット"と言えば、そこにplany articalsがありますが、mongoはほんの少ししか見つかりません – Squirll