2012-10-05 33 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