2012-04-20 15 views
35

Wie kann ich alle Objekte in einer Datenbank finden, wo ein Feld eines Objekts einen Teilstring enthält?Wie finde ich einen Teilstring in einem Feld in Mongodb?

Wenn das Feld mit einem String-Wert A in einem Objekt aus einer Sammlung ist:

Ich möchte all Objekte in der db „Datenbank“ finden, in der A ein Teil „abc def“ sagen enthält.

Ich habe versucht:

db.database.find({A: {$regex: '/^*(abc def)*$/''}}) 

aber hat nicht funktioniert

UPDATE

Ein echter String (in Unicode):

Sujet Commentaire sur Star Wars Episode III - La Revanche des Sith 1 

Sie benötigen für alle suchen Einträge mit Star Wars

db.test.find({A: {$regex: '^*(star wars)*$''}}) not wokring 
+1

tun Wie @derick weist darauf hin, wenn Sie wollen nach "jeder Zeichenkette" suchen, Sie brauchen '. *': '.' für jedes (einzelne) Zeichen,' * 'für" die vorherige Sache irgendeine Zahl (einschließlich null) mal. Die '(star wars) * $ ', die du hast, würden" star warsstar warsstar wars "aber nicht" star wars is great "entsprechen. – drevicko

Antwort

39

Statt dessen:

db.database.find({A: {$regex: '/^*(abc def)*$/''}}) 

Sie sollten dies tun:

db.database.find({A: /abc def/i }) 

^* ist nicht wirklich gültige Syntax wie^und $ Anker sind und nicht etwas, das wiederholbar ist. Du hast wahrscheinlich hier gemeint. Aber es gibt keine Notwendigkeit für ^. *, Da das einfach bedeutet "Alles bis zum Zeichen folgt" und (abc def) * bedeutet "0 oder mehr mal" abc def ", aber es muss am Ende der Zeichenfolge sein, wegen Ihres $. die „i“ am Ende ist es Groß- und Kleinschreibung zu machen.

+2

Beachten Sie, dass die Verwendung von '^' die Regex-Abfrage beschleunigt, da Indizes nur in dieser Form wirksam sind (siehe unten auf der Seite unter http://docs.mongodb.org/manual/reference/operator/regex/). –

+0

Richtig ich, wenn ich falsch liege, aber macht '^ *' einen Sinn? Sollte es nicht '^. *' Sein? Zu mir '^ *' liest "Null oder mehr Anfänge der Linie", von denen es nur und immer eine gibt, und es sieht für mich so aus, als ob es keine Zeichen zwischen dem Anfang der Zeile und dem Rest der Regex erlaubt ... – drevicko

+0

@drevicko, du hast Recht. Das war ein Tippfehler in meiner Antwort. Ich habe es geklärt. – Derick

16

einfach die Zeichenfolge „Star Wars“ verwenden und $regex den Rest

db.test.find({A: {$regex: 'Star Wars'}}) 
Verwandte Themen