2012-10-05 32 views
0

我正在使用MongoDB中动态查询,利用他们这样说:PHP +的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')

在此先感谢。

回答

0

你可以给尝试如下

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

如何在运营商加$

$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); 
+0

谢谢。你为简单而得到正确的答案。只是一个快速的一个:\t'$ query ['$ or'] = array(array('lang'=>'fr'),array('lang'=>'de')); \t $ query ['$ or'] = array(array('_ id'=> new mongoId('506d95bc5c73952c14000002')));'我怎么能'在第一个中加上'第二'或'?它现在的方式,它只是覆盖它。我知道这个问题超出了问题的范围,但是,好吧...... –

+0

要点击> 6 &&(lang =='de'|| lang =='fr'|| _id =='506d95bc5c73952c14000002') ? – GBD

+0

是的,但不完全是。我想知道如何动态地添加更多的ORs(我需要循环一些ID并添加它们,但它并没有太多的问题,但如果你能提供帮助的话, 。新的或不必须是brakets –

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); 
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') 
)) 

将能够使用多个索引,但在这种情况下,没用,因为它只会超过一个领域,所以更好使用$in