2010-05-25 7 views
13

Ich möchte Regex eine Integer-Wert in MongoDB suchen. Ist das möglich?MongoDB Regex Suche auf Integer Wert

Ich baue eine CRUD-Typ-Schnittstelle, die * für Wildcards auf den verschiedenen Feldern erlaubt. Ich versuche, die Benutzeroberfläche für einige Felder, die ganze Zahlen sind, konsistent zu halten.

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, füge ich ein Objekt, und ich bin in der Lage um den Wert zu finden. Wenn ich eine einfache Regex versuche, kann ich das Objekt nicht wirklich finden.

Danke!

Antwort

35

Wenn Sie eine Musterübereinstimmung mit Zahlen machen möchten, verwenden Sie den $ where Ausdruck und übergeben Sie eine Musterübereinstimmung in Mongo.

> db.test.find({ $where: "/^123.*/.test(this.example)" }) 
{ "_id" : ObjectId("4bfc3187fec861325f34b132"), "example" : 1234 } 
+4

Als unabhängige Spitze, macht diese Arbeit in PHP, müssen Sie passieren in Array ('$, wo' => neuen MongoCode (/^123 * /. .test (this.example) "); –

+2

@dalton Nur neugierig hier, wäre der $ regex-Operator nicht effizienter als $ wo? – talentedmrjones

+0

Es stellte sich heraus, dass etwas Ähnliches für den Ruby-Treiber gelten würde, wie @gary darauf hinwies, aber nein. Dies sollte wie ein charm funktionieren. Db.test.find ("$ where" => "/^123.*/.test(this.example)") – Vivek

3

Ich bin kein großer Fan der Verwendung der $where Abfrage Betreiber wegen der Art und Weise des Abfrageausdruck und das Sicherheitsrisiko bewertet, wenn die Abfrage von Benutzereingaben Daten verwendet.

Dies ist der beste Weg, dies zu tun ist $project Ihr Dokument und fügen Sie ein anderes berechnetes Feld, das ist der String-Wert Ihrer Nummer.

Die $toLower und seine Schwester $toUpper Operatoren jeweils eine Zeichenfolge in Klein- und Großbuchstaben konvertieren, aber haben ein wenig unbekannte Funktion, die das ist, können sie verwendet werden, um Integer in String zu konvertieren.

Der Operator $match gibt alle Dokumente zurück, die mit dem Operator $regex übereinstimmen.

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, was Sie wollen, ist all das Dokument abgerufen werden, die eine bestimmte Zeichenkette enthält, die leichten und besseren Weg, dies zu tun, ist in der bevorstehenden Veröffentlichung von MongoDB (zum jetzigen Zeitpunkt) unter Verwendung des $redact Operators, der eine $cond logische Verarbeitung zulässt. $indexOfCP.

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

, die produziert:

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

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