2010-05-25 9 views
13

Quiero regex buscar un valor entero en MongoDB. es posible?MongoDB Regex Search en Integer Value

Estoy construyendo una interfaz de tipo CRUD que permite * para comodines en los diversos campos. Estoy tratando de mantener la UI constante para algunos campos que son enteros.

considerar:

> db.seDemo.insert({ "example" : 1234 }); 
> db.seDemo.find({ "example" : 1234 }); 
{ "_id" : ObjectId("4bfc2bfea2004adae015220a"), "example" : 1234 } 
> db.seDemo.find({ "example" : /^123.*/ }); 
> 

Como se puede ver, insertar un objeto y que soy capaz de encontrarlo por el valor. Si intento una expresión regular simple, no puedo encontrar el objeto.

Gracias!

Respuesta

35

Si quiere hacer una coincidencia de patrón en los números, la forma de hacerlo en mongo es usar la expresión $ where y pasar una coincidencia de patrón.

> db.test.find({ $where: "/^123.*/.test(this.example)" }) 
{ "_id" : ObjectId("4bfc3187fec861325f34b132"), "example" : 1234 } 
+4

Como una punta sin relación, para hacer este trabajo en PHP, es necesario pasar en Array ('$ donde' => nueva MongoCode (/^123 * /. .test (this.example) "); –

+2

@dalton Simplemente curioso, ¿el operador $ regex no sería más eficiente que $ donde? – talentedmrjones

+0

Supuse que algo similar se aplicaría al controlador de Ruby, como señaló @gary, pero no. Esto debería funcionar como un encanto db.test.find ("$ where" => "/^123.*/.test(this.example)") – Vivek

3

No soy un gran fan del uso del operador $where consulta debido a la forma en que se evalúa la expresión de consulta y el riesgo de seguridad si la consulta utiliza los datos de entrada del usuario.

Dicho esto, la mejor manera de hacerlo es $project su documento y agregue otro campo calculado que es el valor de cadena de su número.

$toLower y sus hermanos $toUpper operadores respectivamente convierten una cadena a minúsculas y mayúsculas, pero tienen una pequeña característica desconocida que es que, se pueden usar para convertir un entero en una cadena.

El operador $match devuelve todos los documentos que coincidan con su patrón utilizando el operador $regex.

db.seDemo.aggregate(
    [ 
     { "$project": { 
      "stringifyExample": { "$toLower": "$example" }, 
      "example": 1 
     }}, 
     { "$match": { "stringifyExample": /^123.*/ } } 
    ] 
) 

que produce:

{ 
    "_id" : ObjectId("579c668c1c52188b56a235b7"), 
    "example" : 1234, 
    "stringifyExample" : "1234" 
} 

{ 
    "_id" : ObjectId("579c66971c52188b56a235b9"), 
    "example" : 12334, 
    "stringifyExample" : "12334" 
} 

Ahora bien, si lo que quiere es recuperar todo el documento que contiene una subcadena en particular, la manera más fácil y mejor de hacer esto es en el próximo lanzamiento de MongoDB (al momento de escribir esto) utilizando el operador $redact que permite un procesamiento lógico de lógica $cond. $indexOfCP.

db.seDemo.aggregate([ 
    { "$redact": { 
     "$cond": [ 
      { "$gt": [ 
       { "$indexOfCP": [ 
        { "$toLower": "$example" }, 
        "123" 
       ] }, 
       -1 
      ] }, 
      "$$KEEP", 
      "$$PRUNE" 
     ] 
    }} 
]) 

que produce:

{ 
    "_id" : ObjectId("579c668c1c52188b56a235b7"), 
    "example" : 1234 
} 

{ 
    "_id" : ObjectId("579c66971c52188b56a235b9"), 
    "example" : 12334 
}