2012-05-14 10 views
5

->Por favor ver las actualizaciones en la parte inferior, que he reproducido la misma cuestión en Mongo cáscaraphp Mongo encontrar sólo utilizar 4 criterios

Mis criterios se está pasando a través de parámetros GET y se guarde dentro $ de datos (como una matriz assc). Luego llega a la sección de abajo, donde cada término de búsqueda se convierte en parcial, no coincidencia exacta. Después de eso eliminamos (desarmamos) los criterios vacíos.

En total hay 15 campos posibles que pueden configurarse al menos 1 y como máximo todos los 15.

foreach ($data as $k => $v) { 
    // Make them partial match 
    $data[$k] = new MongoRegex('/'.$v.'/i'); 
    // Remove empty criteria 
    if (empty($v)) unset($data[$k]); 
} 
// Run the search 
$cursor = $this->collection->find($data); 

Todo funciona dulce, siempre y cuando pasaron criterios son 4 o menos como:

Array ( 
    [phone] => MongoRegex Object ([regex] => 433 [flags] => i) 
    [property_name] => MongoRegex Object ([regex] => west [flags] => i) 
    [city] => MongoRegex Object ([regex] => H [flags] => i) 
    [zip_postcode] => MongoRegex Object ([regex] => 9 [flags] => i) 
) 

Esto devuelve 5 resultados.

Pero cualquier criterio agregado después del 4to es ineficaz.

Array ( 
    [phone] => MongoRegex Object ([regex] => 433 [flags] => i) 
    [state_province] => MongoRegex Object ([regex] => Virginia [flags] => i) 
    [property_name] => MongoRegex Object ([regex] => west [flags] => i) 
    [city] => MongoRegex Object ([regex] => H [flags] => i) 
    [zip_postcode] => MongoRegex Object ([regex] => 9 [flags] => i) 
) 

Esto debería devolver 2, pero sigue devolviendo 5 y volverá 5 no importa cuántos artículos se añaden criterios

- actualización -

Así que lo han intentado en el Shell y para mi sorpresa, tampoco funciona allí.

db.property_list.find({phone:/433/, property_name:/west/, city:/h/, zip_postcode:/9/}).count() 

retornos 5

Ahora cuando agrego el quinto parámetro debería limitar los resultados a 2 pero es ineficaz y todavía muestran cuentan como 5 !!!

db.property_list.find({phone:/433/, property_name:/west/, city:/h/, zip_postcode:/9/, state_province:/Virginia/}).count() 

retornos 5

Con una gran cantidad de experimentos, me di cuenta de que es sólo los 4 primeros criterios de ser recogido !! Como si en el último ejemplo cambiara el lugar por 'state_province' y 'city', será un criterio de "ciudad" que será ineficaz ya que será el quinto criterio.

- Nueva actualización -

Resulta que si uso partido normal en vez de expresiones regulares en los criterios de 5to va a trabajar. ¿Estoy en lo cierto al suponer que Mongo puede hacer find() solo para 4 criterios regex? por lo que esto correctamente devuelve 1

db.property_list.find({phone:/433/, property_name:/west/, city:/h/, zip_postcode:/9/, state_province:Virginia}).count() 
+0

¿Ocurre lo mismo si solo tiene "state_province"?¿Puedes replicar esto en el caparazón de Mongo? – Derick

+0

Hola, Derick, gracias por tu respuesta. Lo he probado también en el shell de Mongo y, para mi sorpresa, sigue el mismo problema ... ¡Estoy casi seguro de que Mongo no está restringiendo los criterios de expresión regular a 4! – Zoheir

Respuesta

2

Hay un límite duro de 4 criterios de expresiones regulares permitidas por consulta. Se fija en el código del núcleo mongo hace unos seis meses: https://github.com/mongodb/mongo/commit/62554d064a264f9b6c28099ba71421f250bbbba9

Parece que este arreglo no se ha tirado a los 1,8 ó 2,0 ramas de mongo, sin embargo, aquí está la rama v1.8 que muestra el límite duro: https://github.com/mongodb/mongo/blob/v1.8/db/matcher.cpp#L159

+0

Gracias SteveK! Pero parece que tampoco se ha corregido en las versiones posteriores: – Zoheir

+0

Ahh, tienes razón, está corregido en la rama principal (http://bit.ly/Kbjfeh) pero aún no está en v2.0 (http : //bit.ly/Kbjm9M). De hecho, la rama v2.0 todavía está un poco por detrás de master (http://bit.ly/KbjrtT). Parece que tendrás que encontrar otra forma de solucionar este problema. Por cierto, he tratado de reproducir este problema en mi base de datos, pero incluso cuando uso expresiones regulares en campos indexados, 4 componentes de expresiones regulares lo hacen tan lento que no puedo obtener una comparación fácilmente: P – SteveK

+0

Pude reproducirlo. Compruebe su mongodb.log, debería ver esto: 'lun 14 de mayo 22:02:30 [conn290] ERROR: demasiadas expresiones regulares en la consulta' – SteveK

Cuestiones relacionadas