2012-01-01 21 views
5

Estoy teniendo problemas con esta consulta MongoDB utilizando sintaxis de matriz PHP. Esta es una versión directa de la consulta que quiero usar.

db.collection.find({ 
     $or: [ 
      {$and : [{X:1}, {X: {$gt: 100}}]}, 
      {$and : [{X:2}, {X: {$lt: 100}}]} 
     ] 
}); 

Nota: La consulta real es más complicado, esto es sólo un ejemplo.

No pude encontrar algunos ejemplos que describan este tipo de consulta en PHP. La mejor que he llegado era la siguiente:

$query = array(
    '$or' => array(
     array(
      '$and' => array(
       array('X' => 1), 
       array('X' => array('gt' => 100)) 
      ) 
     ), 
     array(
      '$and' => array(
       array('X' => 2), 
       array('X' => array('lt' => 100)) 
      ) 
     ), 
    ) 
); 

$this->db->collection->find($query); 

Sin embargo, esta consulta no devuelve ningún resultado. Obviamente no podemos eliminar $and de la matriz porque no podemos tener claves duplicadas en la matriz de PHP.

No quiero usar expresiones de JavaScript porque la velocidad es crítica.

ACTUALIZACIÓN: como Alexander Azarov señaló en los comentarios, mi consulta original se puede escribir de manera diferente. He actualizado la pregunta con la consulta $and correctamente utilizada.

+0

¿Qué exactamente no funciona? ¿Tienes mensajes de error? –

+0

La consulta se ejecuta correctamente pero devuelve 0 resultados. –

+0

¿Podría publicar un volcado de datos de muestra? –

Respuesta

10

Aquí hay un ejemplo del código con los operadores o y y en PHP para una consulta de Mongo.

Utiliza diferentes nombres de campo de lo que va a encontrar en su consulta, pero es fácil de entender cómo usarlo.

En este momento no tengo tiempo para cambiarlo, para que coincida con su consulta, pero si tiene problemas con eso, hágamelo saber y lo ajustaré. Esta consulta funciona y encuentra lo que debería encontrar.

$arrFind = array(
    '$or' => array(
     array(
      '$and' => array(
       array(
        UI_name => array(
         '$regex' => 'andrew', 
         '$options' => 'i' 
        ) 
       ), 
       array(
        UI_surname => array(
         '$regex' => 'mik', 
         '$options' => 'i' 
        ) 
       ) 
      ) 
     ), 
     array(
      '$and' => array(
       array(
        UI_surname => array(
         '$regex' => 'andrew', 
         '$options' => 'i' 
        ) 
       ), 
       array(
        UI_name => array(
         '$regex' => 'mik', 
         '$options' => 'i' 
        ) 
       ) 
      ) 
     ), 
    ) 
); 
Cuestiones relacionadas