PyMongo $in + $regex
Wie kann ich kombinieren, $regex mit $in PyMongo?
Ich suchen will, entweder /*.heavy.*/
oder /*.metal.*/
.
Versuchte ich in python ohne Erfolg:
db.col.find({'music_description' : { '$in' : [ {'$regex':'/*.heavy.*/'} ]} })
Den Gegenwert in der Mongo shell ist:
db.inventory.find( { music_description: { $in: [ /heavy/, /metal/] } } )
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwendung von python reguläre Ausdrücke.
Warum einmal die Mühe mit einem $in?
Sie verschwenden Verarbeitung durch die Auswertung der Feld für jeden Wert in der Liste aus, und da jeder Wert ist eine regex, es hat seine eigenen performance-überlegungen,
Je nachdem, wie lange eine query-strings erhalten, es wäre klug, nur um zu wickeln Sie Sie in einem regex und vermeiden Sie die $in der Abfrage alle zusammen
ähnlich wie in der mongo shell
als für [user2998367]'s Antwort, Sie verschwenden Effizienz kompilieren eine regex mit gierigen Platzhalter für den alleinigen Zweck, eine übereinstimmung, der Unterschied zwischen re.search und re.Spiel in python erfordert die Verwendung von wildcards für die re.Suche Zwecke, sondern re.Spiel verhält sich wie 'überall in string', wie MongoDB, es ist nur wirklich notwendig, wenn Sie beabsichtigen, zu extrahieren, die Sie würde tun müssen, um später, nachdem die Abfrage jedenfalls, oder wenn Sie die Wiederverwendung werden eine kompilierte regex irgendwo anders, die Sie speziell benötigen, wieder.die Suche über die re.match
$in
Abfrage ist ziemlich vielfältig-mit vielen Einsatzmöglichkeiten. Der erste ist der offensichtliche Fall, dass es heißt, "Einige linke hand Wert ist in dieser Reihe von möglichen rechten Werte", das, was er zu sein scheint Abfragen hier (der namemusic_description
in keiner Weise zeigt, ist es ein array von Werten,...) Die weitere Verwendung ist, was Sie denken, die "dieses Array linke hand-Wert enthält einen oder alle von diesen rechten hand(s)" - das kann auch geschrieben werden alsdb.s.find({'someArray': {$in: oneValue}})
anstelle der array-schließlich auch alsdb.s.find({'someArray': oneValue})
für die Kürze