there similar insensitive index ilike feature example regex mongodb mongodb-query aggregation-framework

similar - mongoose regex



MongoDB búsqueda de expresiones regulares en valor entero (2)

No soy un gran fan de usar el operador $where query debido a la forma en que evalúa la expresión de consulta, no usa índices y el riesgo de seguridad si la consulta usa datos de entrada del usuario.

A partir de MongoDB 4.2, puede utilizar $regexMatch|$regexFind|$regexFindAll disponible en MongoDB 4.1.9+ y $expr para hacer esto.

let regex = /123/;

  • $regexMatch y $regexFind

    db.col.find({ "$expr": { "$regexMatch": { "input": {"$toString": "$name"}, "regex": /123/ } } })

  • $regexFinAll

    db.col.find({ "$expr": { "$gt": [ { "$size": { "$regexFindAll": { "input": {"$toString": "$name"}, "regex": "123" } } }, 0 ] } })

Desde MongoDB 4.0, puede usar el operador $toString , que es un envoltorio alrededor del operador $convert para clasificar los enteros.

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

Si lo que desea es recuperar todo el documento que contiene una subcadena particular, a partir de la versión 3.4, puede usar el operador $redact que permite un procesamiento lógico condicional de $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 }

Antes de MongoDB 3.4, necesita $project su documento y agregar otro campo computado que es el valor de cadena de su número.

Los $toLower y su hermano $toUpper respectivamente convierten una cadena en minúsculas y mayúsculas, pero tienen una pequeña característica desconocida que es que pueden usarse para convertir un número entero en una cadena.

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

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

cuyos rendimientos:

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

Ahora, si lo que desea es recuperar todo el documento que contiene una subcadena particular, la forma más fácil y mejor de hacerlo es en el próximo lanzamiento de MongoDB (a partir de este escrito) usando el operador $redact que permite una lógica condicional de $cond tratamiento. $indexOfCP .

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

Quiero regex buscar un valor entero en MongoDB. es posible?

Estoy creando una interfaz de tipo CRUD que permite * para los comodines en los diversos campos. Estoy tratando de mantener la interfaz de usuario coherente 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 puede ver, inserto un objeto y puedo encontrarlo por el valor. Si intento una expresión regular, no puedo encontrar el objeto.

¡Gracias!


Si desea 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 }