0

我正在使用 mongoDB 中的动态查询,以这种方式使用它们:

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

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

这个问题非常简单明了:如何添加“或”条件?例如让“lang”都为“de”或“fr”;

因为现在,Mongo 暗示“clicks”和“lang”之间存在 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'))));

有时这往往会更有效地使用索引。

另请注意,nested$or目前不使用索引,但$or可以使用多个索引计划,这意味着这样的查询:

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

可以使用多个索引,但在这种情况下它是无用的,因为它只遍历一个字段,所以更好用$in

于 2012-10-05T10:20:36.233 回答