MongoDB Regex Ricerca sul Valore intero
-
04-10-2019 - |
Domanda
Voglio regex cercare un valore intero in MongoDB. È possibile?
Sto costruendo un'interfaccia di tipo CRUD che permette * per i caratteri jolly nei diversi settori. Sto cercando di mantenere l'interfaccia utente coerente per alcuni campi che sono interi.
Si consideri:
> db.seDemo.insert({ "example" : 1234 });
> db.seDemo.find({ "example" : 1234 });
{ "_id" : ObjectId("4bfc2bfea2004adae015220a"), "example" : 1234 }
> db.seDemo.find({ "example" : /^123.*/ });
>
Come potete vedere, ho inserire un oggetto e io sono in grado di trovare per il valore. Se provo una semplice espressione regolare, che attualmente non posso trovare l'oggetto.
Grazie!
Soluzione
Se si vogliono fare un match modello sui numeri, il modo per farlo in Mongo è usare l'espressione $ dove e passare in un match modello.
> db.test.find({ $where: "/^123.*/.test(this.example)" })
{ "_id" : ObjectId("4bfc3187fec861325f34b132"), "example" : 1234 }
Altri suggerimenti
Io non sono un grande fan di utilizzare il $where
interrogazione operatore a causa del modo in cui valuta l'espressione di query, non fa uso di indici e il rischio per la sicurezza se la query utilizza i dati di input utente.
A partire da MongoDB 4.2 è possibile utilizzare il $regexMatch|$regexFind|$regexFindAll
disponibile in MongoDB 4.1.9+ e il $expr
per fare questo.
let regex = /123/;
-
$regexMatch
e$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 ] } })
Da MongoDB 4.0 è possibile utilizzare l'operatore $toString
che è un wrapper per l'operatore $convert
a stringa i interi.
db.seDemo.aggregate([
{ "$redact": {
"$cond": [
{ "$gt": [
{ "$indexOfCP": [
{ "$toString": "$example" },
"123"
] },
-1
] },
"$$KEEP",
"$$PRUNE"
]
}}
])
Se quello che vuoi è di recuperare tutti i documenti che contengono una particolare stringa, a partire dalla versione 3.4, è possibile utilizzare il $redact
operatore che permette un $cond
pre- sentano logica processing.$indexOfCP
.
db.seDemo.aggregate([
{ "$redact": {
"$cond": [
{ "$gt": [
{ "$indexOfCP": [
{ "$toLower": "$example" },
"123"
] },
-1
] },
"$$KEEP",
"$$PRUNE"
]
}}
])
che produce:
{
"_id" : ObjectId("579c668c1c52188b56a235b7"),
"example" : 1234
}
{
"_id" : ObjectId("579c66971c52188b56a235b9"),
"example" : 12334
}
Prima di MongoDB 3.4, è necessario $project
tua documento e aggiungere un altro campo calcolato che è il valore della stringa del vostro numero.
Il $toLower
e suo fratello operatori $toUpper
nofollow noreferrer convertire, rispettivamente, una stringa in caratteri minuscoli e maiuscoli, ma hanno una caratteristica poco sconosciuto che è che possono essere usati per convertire un numero intero a stringa.
$match
restituisce operatore tutti quei documenti che corrispondono alla vostra modello utilizzando l'operatore $regex
.
db.seDemo.aggregate(
[
{ "$project": {
"stringifyExample": { "$toLower": "$example" },
"example": 1
}},
{ "$match": { "stringifyExample": /^123.*/ } }
]
)
che i rendimenti:
{
"_id" : ObjectId("579c668c1c52188b56a235b7"),
"example" : 1234,
"stringifyExample" : "1234"
}
{
"_id" : ObjectId("579c66971c52188b56a235b9"),
"example" : 12334,
"stringifyExample" : "12334"
}
Ora, se quello che vuoi è di recuperare tutti i documenti che contengono una particolare stringa, il modo più facile e migliore per farlo è nel prossimo rilascio di MongoDB (al momento della scrittura) utilizzando il $redact
operatore che permette un $cond
pre- sentano logica processing.$indexOfCP
.
db.seDemo.aggregate([
{ "$redact": {
"$cond": [
{ "$gt": [
{ "$indexOfCP": [
{ "$toLower": "$example" },
"123"
] },
-1
] },
"$$KEEP",
"$$PRUNE"
]
}}
])