2017-01-04 4 views
0

RoboMongoでは、このような値のネストされた配列があります。MongoDBの全コレクション配列で検索します。

enter image description here

それともこれは少し明確になるかもしれません。

enter image description here

(1つのクエリで)正規表現ですべてのキー/値のペアを検索することができるという方法はありますか?このスクリプトでは、いくつのcustomFieldキー/値ペアがあるか分かりません。

これまでのところ私はPHPを使用しています。

['poco.customFields.0.value' => ['$regex' => '.*'.$query.'.*', '$options' => 'i']],きれいに最初のキー/値のペアに取り組んでいる

..しかしない他の人と私は2つのクエリを実行するか、単にこれ以上がないことを推測するのいずれかなしにそれを行う方法がわかりません100を超えてループしているだけです。

+0

これは$で行うことができると確信していますが、PHPの構文がわからない場合は、配列内のキーと値のペアをループできるjavascript関数を渡すことができる$をチェックできます。 –

+0

期待される出力は?あなたはあなたの質問にそれを加えてください。 – dikesh

答えて

0

正規表現の正規表現に一致するcustomFieldsの内容を持つドキュメントを取得すると仮定すると、2つの解釈が考えられます。

:(2)パターンに一致customFieldsに 全て値を持つすべてのドキュメントを返す

[ 'customFields.value' => [ '$regex' => $pattern, '$options' => 'i' ]] 

(1)パターンに一致customFieldsに少なくとも一つ値を持つすべてのドキュメントを返します

[ 'customFields.value' => [ '$not' => new MongoDB\BSON\Regex('\b^(?!'.$pattern.').+', 'i') ]] 

最初のクエリは自明です。customFields配列のすべての要素を繰り返し、それぞれの正規表現チェックを実行します。少なくとも1つの要素がパターンと一致する場合、親文書が返されます。

もう1つはもう少し洗練されています。要件「どこ全て要素一致特定のパターンは」「単一要素特定のパターンに一致しません場合」に相当します。二重否定を達成するために、$notと、これまで使用したのと同じクエリに否定的な先読みを適用することによって作成された逆正規表現を使用します。 $notは文字列の受け入れを拒否しているので、MongoDB\BSON\Regexクラスのインスタンスを使用して正規表現を生成します。

否定先読みの詳細はhereです。

+0

それは素晴らしいです。私はいくつかのテストをして、それは動作するようです。私はクエリが単にエラーの代わりに配列を反復することを知っているとは思っていませんでした。 – mikelovelyuk

+0

@mikelovelyuk私は助けてくれて非常にうれしいです。あなたの問題を完全に解決した場合は、回答を受け入れたものとしてマークするか、もしあれば明確にしたい詳細を追加してください。 – Imperator

関連する問題