2011-05-24 12 views
2

私はmongoDBでDoctrine ODMを使用しています。Doctrine ODM/MongoDB:クエリのAND

ように私は、クエリをやろうとしている

:アイデアは私が取得しています、私が使用している構文との

array_field(event_value_1 OR event_value_2) AND (odd_value_1 OR odd_value_2) 

で持っているすべての文書を選択することです

$queryBuilder->field('array_field')->in('even_value_1', 'event_value_2'); 
$queryBuilder->field('array_field')->in('odd_value_1', 'odd_value_2'); 

event_value_1 OR event_value_2 OR odd_value_1 OR odd_value_2 

どのように進むか、可能であるかについてのアイデアはありますか?

答えて

3

$と演算子はMongoDBでは現在利用できません。ここで $とオペレータが1.9.1である(不安定版)

は、機能要求のためのチケットです: https://jira.mongodb.org/browse/SERVER-1089

現在(は1.8.x)唯一の解決策は、「$または」複数を使用しているようです

even_value_1 AND odd_value_1 
OR even_value_1 AND odd_value_2 
OR even_value_2 AND odd_value_1 
OR event_value_2 AND odd_value_2 

EDIT:ようたstatmentsここ

まず、将来のユーザーを支援するためにいくつかのコードがあるが、私たちは

を変換する機能を必要としますここで

even_value_1 AND odd_value_1 
OR even_value_1 AND odd_value_2 
OR even_value_2 AND odd_value_1 
OR event_value_2 AND odd_value_2 

から210

array_field(event_value_1 OR event_value_2) AND (odd_value_1 OR odd_value_2) 

は教義ODMの部分については必要な機能

/** 
* $pArray for our example should be like array(array(event_value_1, 
*     event_value_2),array(odd_value_1, odd_value_2)) 
*/ 
function transform_and_group_of_or_to_or_group_of_and ($pArray) 
{ 
    //Make sure we have sequential numerical indexes 
    sort($pArray); 

    $maxIndices = array(); 
    foreach ($pArray as $key=>&$values){ 
     //Make sure we have sequential numerical indexes 
     sort($values); 

     $maxIndices[$key] = count($values)-1; 
     $arIndices[$key] = 0; 
    } 

    $groupCount = count($pArray); 
    $groupOfAnd = array(); 

    do { 
     $newGroup = array(); 
     for ($i=0; $i<$groupCount; $i++){ 
      $indice = $arIndices[$i]; 
      $sousTab = $pArray[$i]; 
      $newGroup[] = $sousTab[$indice]; 
     } 
     $groupOfAnd[] = $newGroup; 
    } while(increment_numbers($arIndices, $maxIndices)); 

    return $groupOfAnd; 
} 

function increment_numbers(& $arIndices, $maxIndices){ 
    //Raise the last indice 
    $arIndices[count($arIndices)-1]++; 

    $check = true; 
    for ($i=count($arIndices)-1; (($i>=0) && ($check === true)); $i--){ 
     if ($arIndices[$i] > $maxIndices[$i]){ 
      if ($i > 0){ 
       $arIndices[$i-1]++;//increment the upper indice element 
      } else { 
       return 0; 
      } 
      $arIndices[$i] = 0; 
      $check=true; 
     }else{ 
      $check = false; 
     } 
    } 
    return true; 
} 

です:

if (count($arGroupedCritere)) { 
     $arGroupedCritere = transform_and_group_of_or_to_or_group_of_and($arGroupedCritere); 
      foreach($arGroupedCritere as $arCritere) { 
       $queryBuilder->addOr($queryBuilder->expr()->field('_criteres')->all($arCritere)); 
      } 
    } 

が、これは

を役に立てば幸い