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
}
Como una punta sin relación, para hacer este trabajo en PHP, es necesario pasar en Array ('$ donde' => nueva MongoCode (/^123 * /. .test (this.example) "); –
@dalton Simplemente curioso, ¿el operador $ regex no sería más eficiente que $ donde? – talentedmrjones
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