5

-->下部の更新を参照してください。Mongo シェルで同じ問題を再現しました。

私の基準はGETパラメーターを介して渡され、$dataに(assc配列として)配置されます。次に、各検索語が完全一致ではなく部分一致になる以下のセクションに進みます。その後、空の基準を削除 (設定解除) します。

全部で 15 のフィールドがあり、少なくとも 1 つ、最大で 15 のすべてを設定できます。

foreach ($data as $k => $v) { 
     // Make them partial match
     $data[$k] = new MongoRegex('/'.$v.'/i');
     // Remove empty criteria
     if (empty($v)) unset($data[$k]); 
}
// Run the search
$cursor = $this->collection->find($data);

次のように、合格基準が 4 以下である限り、すべてがスムーズに機能します。

Array ( 
   [phone] => MongoRegex Object ( [regex] => 433 [flags] => i ) 
   [property_name] => MongoRegex Object ( [regex] => west [flags] => i ) 
   [city] => MongoRegex Object ( [regex] => H [flags] => i ) 
   [zip_postcode] => MongoRegex Object ( [regex] => 9 [flags] => i ) 
)

これにより、5 つの結果が返されます。

ただし、4 番目以降に追加された基準は無効です。

Array ( 
   [phone] => MongoRegex Object ( [regex] => 433 [flags] => i ) 
   [state_province] => MongoRegex Object ( [regex] => Virginia [flags] => i ) 
   [property_name] => MongoRegex Object ( [regex] => west [flags] => i ) 
   [city] => MongoRegex Object ( [regex] => H [flags] => i ) 
   [zip_postcode] => MongoRegex Object ( [regex] => 9 [flags] => i )
)

これは 2 を返すはずですが、それでも 5 を返し、基準項目をいくつ追加しても 5 を返します。

--アップデート--

そのため、シェルで試してみましたが、驚いたことに、そこでも機能しません。

db.property_list.find({phone:/433/, property_name:/west/, city:/h/, zip_postcode:/9/}).count()

5 を返します

5 番目のパラメーターを追加すると、結果は 2 に絞り込まれますが、効果がなく、カウントが 5 と表示されます!!!

db.property_list.find({phone:/433/, property_name:/west/, city:/h/, zip_postcode:/9/, state_province:/Virginia/}).count()

5 を返します

たくさんの実験で、最初の4つの基準だけがピックアップされていることに気付きました!! 最後の例で場所を切り替える'state_province''city'、5番目の基準になるため無効になる「都市」基準になります!!

--新規アップデート--

5番目の基準で正規表現の代わりに通常の一致を使用すると、機能することがわかりました。Mongo が 4 つの正規表現基準に対してのみ find() を実行できると仮定するのは正しいですか? したがって、これは正しく1 を返します

db.property_list.find({phone:/433/, property_name:/west/, city:/h/, zip_postcode:/9/, state_province:Virginia}).count()
4

1 に答える 1

2

クエリごとに許可される正規表現基準は 4 つという厳しい制限があります。これは、約 6 か月前にコアmongoコードで修正されました。

この修正はまだ mongo の 1.8 または 2.0 ブランチに取り込まれていないようです。ハード リミットを示す v1.8 ブランチは次のとおりです: https://github.com/mongodb/mongo/blob/v1.8/db/ matcher.cpp#L159

于 2012-05-15T01:14:29.143 に答える