MongoDB Regex Suche auf Integer Wert
-
04-10-2019 - |
Frage
Ich möchte einen Integer-Wert in MongoDB regex suchen. Ist das möglich?
Ich baue einen CRUD-Typ-Schnittstelle, die auf den verschiedenen Feldern für Platzhalter * ermöglicht. Ich versuche, die UI konsistent für einige Felder zu halten, die ganzen Zahlen sind.
Bedenken Sie:
> db.seDemo.insert({ "example" : 1234 });
> db.seDemo.find({ "example" : 1234 });
{ "_id" : ObjectId("4bfc2bfea2004adae015220a"), "example" : 1234 }
> db.seDemo.find({ "example" : /^123.*/ });
>
Wie Sie sehen können, habe ich ein Objekt einfügen, und ich bin in der Lage um den Wert zu finden. Wenn ich eine einfache regex versuche, kann ich nicht wirklich das Objekt finden.
Danke!
Lösung
Wenn Sie wollen, um ein Muster Spiel auf Zahlen zu tun, so wie es in Mongo zu tun ist, um den $, wo Ausdruck verwenden und in einem Muster Spiel passieren.
> db.test.find({ $where: "/^123.*/.test(this.example)" })
{ "_id" : ObjectId("4bfc3187fec861325f34b132"), "example" : 1234 }
Andere Tipps
Ich bin kein großer Fan der Verwendung der $where
Abfrage Betreiber wegen der Art und Weise des Abfrageausdruck auswertet, ist es nicht Indizes verwenden und das Sicherheitsrisiko, wenn die Abfrage von Benutzereingaben Daten verwendet.
Ab MongoDB 4.2 Sie die $regexMatch|$regexFind|$regexFindAll
in MongoDB können 4.1.9+ und die $expr
dies zu tun.
let regex = /123/;
-
$regexMatch
und$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 ] } })
Von MongoDB 4.0 Sie den $toString
Operator verwenden können, die einen Wrapper um die $convert
Operator ist auf stringify Zahlen.
db.seDemo.aggregate([
{ "$redact": {
"$cond": [
{ "$gt": [
{ "$indexOfCP": [
{ "$toString": "$example" },
"123"
] },
-1
] },
"$$KEEP",
"$$PRUNE"
]
}}
])
Wenn das, was Sie wollen, ist alles, das Dokument abrufen, die eine bestimmte Zeichenkette enthält, von Release 3.4 beginnend, können Sie die $redact
Betreiber, die eine $project
Ihre Dokument und fügen Sie eine weitere berechnete Feld, das die String-Wert Ihrer Zahl ist.
Die $toLower
und seine Geschwister $match
Zurückgegeben alle jene Dokumente, die Ihrer Suche Muster mit dem $regex
Operator.
db.seDemo.aggregate(
[
{ "$project": {
"stringifyExample": { "$toLower": "$example" },
"example": 1
}},
{ "$match": { "stringifyExample": /^123.*/ } }
]
)
, die ergibt:
{
"_id" : ObjectId("579c668c1c52188b56a235b7"),
"example" : 1234,
"stringifyExample" : "1234"
}
{
"_id" : ObjectId("579c66971c52188b56a235b9"),
"example" : 12334,
"stringifyExample" : "12334"
}
Nun, wenn das, was Sie wollen, ist alles, das Dokument abrufen, die eine bestimmte Zeichenkette enthält, die leichten und besseren Weg, dies ist in der bevorstehenden Veröffentlichung von MongoDB (zum Zeitpunkt des Schreibens) zu tun mit dem $redact
Betreiber, die eine $cond
itional Logik processing.$indexOfCP
.
db.seDemo.aggregate([
{ "$redact": {
"$cond": [
{ "$gt": [
{ "$indexOfCP": [
{ "$toLower": "$example" },
"123"
] },
-1
] },
"$$KEEP",
"$$PRUNE"
]
}}
])