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!

War es hilfreich?

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" 
        ] 
    }}
])
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top