2012-10-05 8 views
0

조건 연산자 :PHP + MongoDB를 dynmic 질의 - 추가 내가 그들에게이 방법을 사용하여, MongoDB의 동적 쿼리를 활용하고

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

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

문제는 매우 단순하고 간단하다을 하나 추가 '또는'할 수있는 방법 조건부? 예를 들어 'lang'이 모두 "de"또는 "fr"이되도록하려면;

현재 Mongo는 "클릭 수"와 "lang"사이에 AND가 있음을 의미합니다. 그러면 클릭 수를 어떻게 구성 할 수 있습니까?> 6 & & (lang == 'de'|| lang == 'fr')

미리 감사드립니다.

답변

0

당신은 더 다양한 범위에 들어가기 시작, 특히

$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'] = 배열 ​​(배열 ('_ id'=> 새로운 mongoId ('506d95bc5c73952c14000002'))) '어떻게하면 "두 번째'또는 '첫 번째? 지금은 그냥 덮어 씁니다. 나는 그것이 문제의 범위를 벗어난 것을 알고 있지만, 음 .. –

+0

클릭 수를 6 && (lang == 'de'|| lang == 'fr'|| _id == '506d95bc5c73952c14000002')로 변경 하시겠습니까? ? – GBD

+0

네,하지만 정확히는 아닙니다. 나는 동적으로 더 많은 OR을 추가 할 수있는 방법을 알고 싶다. (나는 어떤 ID를 반복하고 추가해야 할 것이다. 실제로는 그 질문과 관련이 없지만, 도움이된다면 감사 할 것이다. 그 새 또는 그 안에는하지 않아도됩니다 –

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이 좋은하지만 매우 인덱스 친화적 아래

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

방법 운영자에 $를 추가하려고 줄 수 있습니다 . 약간 더 색인 쉬운 방법은 $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을 사용하는 것이 좋습니다.