Frage

Ich versuche, eine Regex Abfrage mit pymongo gegen einen mongodb Server auszuführen. Die Dokumentstruktur wird wie folgt

{
  "files": [
    "File 1",
    "File 2",
    "File 3",
    "File 4"
  ],
  "rootFolder": "/Location/Of/Files"
}

Ich möchte alle Dateien erhalten, die das Muster * File entsprechen. Ich habe versucht, dies zu tun als solche

db.collectionName.find({'files':'/^File/'})

Doch ich bekomme nichts zurück, bin ich etwas fehle, weil nach dem mongodb docs sollte dies möglich sein. Wenn ich die Abfrage in der Konsole es gut funktioniert Mongo ausführen, bedeutet dies die Unterstützung api tut es oder bin ich benutze es nur falsch

War es hilfreich?

Lösung 2

Turns out regex Suchen sind ein wenig anders in pymongo gemacht, aber ist genauso einfach.

Regex geschieht wie folgt:

db.collectionname.find({'files':{'$regex':'^File'}})

Damit wird alle Dokumente gefunden, die eine Datei Eigenschaft haben, dass ein Element in dem beginnt mit Datei hat

Andere Tipps

Wenn Sie reguläre Ausdrücke (zB ignorieren Fall) aufnehmen möchten, versuchen Sie dies:

import re
regx = re.compile("^foo", re.IGNORECASE)
db.users.find_one({"files": regx})

Um die Doppel Kompilierung vermeiden Sie die BSON regex verwenden können Wrapper, dass mit PyMongo kommt:

>>> regx = bson.regex.Regex('^foo')
>>> db.users.find_one({"files": regx})

Regex speichert nur die Zeichenfolge, ohne zu versuchen, es zu kompilieren, so find_one dann das Argument als Typ ‚Regex‘ erkennen kann und die entsprechende Mongo Abfrage bilden.

Ich fühle mich auf diese Weise etwas mehr Pythonic als die anderen Top-Antwort, z.

>>> db.collectionname.find({'files':{'$regex':'^File'}})

Es lohnt sich auf der BSON Regex Dokumentation zu lesen, wenn Sie planen, regex Abfragen zu verwenden, da gibt es einige Einschränkungen.

Die Lösung von re den Index nicht überhaupt. Sie sollten Befehle wie verwenden:

db.collectionname.find({'files':{'$regex':'^File'}})

(Ich kann nicht Kommentar unterhalb ihrer Antworten, so antworte ich hier)

import re

def get_pattern_query(pattern,starting_with=False,ending_with=False,ignore_case=False):
    start = '^' if starting_with else '.*'
    end = '$' if ending_with else '.*'
    pattern = start + re.escape(pattern) + end
    return re.compile(pattern, re.IGNORECASE) if ignore_case else re.compile(pattern)

Escaping das Muster , bevor Griffe alle Zeichen kompilieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top