0

私はmongoDBの動的クエリを次のように使用して利用しています。

$query['clicks'] = array('$gt' => 6);
$query['lang'] = "de";

$cursor = $collection->find($query);

質問は非常に単純で簡単です。「OR」条件を追加するにはどうすればよいでしょうか。たとえば、両方の「lang」を「de」または「fr」にする。

現在、Mongoは、「クリック」と「ラング」の間にANDがあることを意味しているためです。では、クリックを構造化するにはどうすればよいですか> 6 &&(lang =='de' || lang =='fr')

4

3 に答える 3

1
          $cond=array();
          $cond=array_merge($cond,array("clicks" => array('$gt' =>6)));
          $cond=array_merge($cond,array("$or" => array(array("lang" =>'de'),array("lang" =>'fr'))));

    $cursor = $collection->find($cond);

----------------------------

    another way is : 
       $cond=array();
          $cond=array_merge($cond,array("clicks" => array('$gt' =>6)));
          $cond=array_merge($cond,array("$in" => array('de','fr')));

    $cursor = $collection->find($cond);
于 2012-10-05T09:03:52.033 に答える
0

あなたは以下のように試すことができます

$query['clicks'] = array('$gt' => 6);
$query['$or'] = array(array('lang' => 'de'), array('lang' => 'fr'));
$cursor = $collection->find($query);

$in演算子を追加する方法

$query['clicks'] = array('$gt' => 6);
$query['$or'] = array(array('lang' => 'de'), array('lang' => 'fr'));
$query['_id'] = array('$in' => array(new mongoId('506d95bc5c73952c14000002'), new mongoId('506d95bc5c73952c14000003')));

$cursor = $collection->find($query);
于 2012-10-05T09:07:06.697 に答える
0

$or優れていますが、特により多様な範囲に入り始める場合は、インデックスにあまり適していません。もう少しインデックスに適した方法は次の$inとおりです。

$db->collection->find(array('clicks' => array('$gt' => 6), 
    'lang' => array('$in' => array('fr', 'de'))));

これにより、インデックスをより効率的に使用できる場合があります。

また、ネストされた$orは現在インデックスを使用していません$orが、複数のインデックスプランを使用できることにも注意してください。つまり、次のようなクエリが使用されます。

$db->collection->find(array('clicks' => array('$gt' => 6), '$or' => array(
    array('lang' => 'fr'), arrray('lang' => 'de')
))

複数のインデックスを使用することはできますが、この場合は1つのフィールドのみを対象としているため、使用する方が適切$inです。

于 2012-10-05T10:20:36.233 に答える