2011-05-14 16 views
5

Quiero buscar un primer y último partido nombre parcial - por ejemplo, en SQLCómo hacer o buscar

f_name LIKE J% OR l_name LIKE S% 

se correspondería con John Smith o John Henry o Harry Smith.

Estoy asumiendo que puedo necesitar utilizar el "$ o" operador,

tengo esta tan lejos, que creo que está haciendo la parte COMO% correctamente, pero creo que está haciendo un "Y" de búsqueda (lo que significa que busca f_nombre como J% Y l_name cOMO S% por lo que sólo coincidiría con John Smith):

$name1="J"; 
$name2="S"; 
$cursor = $this->clientCollection->find(array('f_name' => new MongoRegex('/^'.$name1.'/i'), 'l_name' => new MongoRegex('/^'.$name2.'/i'))); 

Nota: Este coincidirá contiene como en% J%

MongoRegex('/'.$name1.'/i') 

Esta voluntad el partido comienza con (Nótese el añadido ^) como en J%

MongoRegex('/^'.$name1.'/i') 

Respuesta

2

$or toma una serie de cláusulas, por lo que, básicamente, sólo tiene que envolver otra matriz alrededor de su consulta actual:

array('$or' => array(
    array('f_name' => new MongoRegex('/'.$name1.'/i')), 
    array('l_name' => new MongoRegex('/'.$name2.'/i')) 
)); 

Editar: el ejemplo anterior se perdió un conjunto interno de llamadas array().

original equivocado, ejemplo, que he publicado se veía así:

array('$or' => array(
    'f_name' => new MongoRegex('/'.$name1.'/i'), 
    'l_name' => new MongoRegex('/'.$name2.'/i') 
)); 

Ésta es una consulta válida, pero no una utilidad. Esencialmente, las partes de consulta f_name y l_name siguen unidas AND, por lo que la parte $or es inútil (solo se pasa una consulta, por lo que es lo mismo que ejecutar solo esa consulta).

En cuanto a la alternativa que mencionó en su comentario, esa no funciona porque la matriz más externa en una consulta tiene que ser una matriz asociativa. La confusión surge porque la sintaxis de consulta de Mongo es similar a JSON y utiliza una mezcla de objetos y matrices, pero ambas estructuras están representadas en PHP por matrices. El controlador PHP Mongo básicamente convierte matrices asociativas de PHP a objetos JSON ({ ... }) y matrices PHP "normales" a matrices JSON ([ ... ]).

El resultado práctico es que las matrices PHP "normales" generalmente solo son válidas cuando están dentro de una matriz asociativa, como cuando se especifican valores múltiples para un campo. El siguiente ejemplo de la PHP Mongo manual muestra un uso válido de una matriz "normal" en una consulta:

$cursor = $collection->find(array("awards" => array('$in' => array("gold", "copper")))); 
+0

Esto funciona, pero me preguntaba por qué el conjunto interior de las llamadas de la matriz? El código original funciona, devuelve registros como AND. Intenté usar cambiando el código a \t $ cursor = $ this-> clientCollection-> find (array (array ('f_name' => new MongoRegex ('/'.$ name1.'/I ')), array (' l_name '=> nuevo MongoRegex ('/'.$ name2.'/i ')))); y no funciona, pero lo hace en su caso con '$ o'. –

+0

He tratado de explicar qué está pasando aquí. Desafortunadamente, todos los PHP 'array()' s pueden hacer que sea bastante difícil saber qué está pasando en una consulta de Mongo en PHP, especialmente de un vistazo. –

Cuestiones relacionadas