我正在使用Doctrine ODM和mongoDB。
我正在尝试查询:
$queryBuilder->field('array_field')->in('even_value_1', 'event_value_2');
$queryBuilder->field('array_field')->in('odd_value_1', 'odd_value_2');
想法是选择
中的所有文档array_field(event_value_1 OR event_value_2) AND (odd_value_1 OR odd_value_2)
使用我正在使用的语法,我正在获取具有
的文档event_value_1 OR event_value_2 OR odd_value_1 OR odd_value_2
有关如何进行或是否有可能的任何想法?
答案 0 :(得分: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
编辑:这是一些帮助未来用户的代码
首先,我们需要一个函数来转换我们的
array_field(event_value_1 OR event_value_2) AND (odd_value_1 OR odd_value_2)
到
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
以下是所需的功能
/**
* $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;
}
对于Doctrine ODM部分:
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));
}
}
希望这有帮助