11 Stimmen

Suche nach mehreren Wörtern mit find() in MongoDB

Ich verwende Python in Verbindung mit MongoDB. Ich habe ein Array von Wörtern, und ich verwende diese Wörter, um die Mongo-Datenbank zu durchsuchen und alle Dokumente mit übereinstimmenden Feldern abzugleichen, indem ich $in z.B.

collection.find({"word":{"$in":words}})

Das obige funktioniert sehr gut, aber ich möchte eine Regex verwenden können. Das Problem ist nun, dass, wenn eines der Wörter im Array buchstabiert wurde accus anstelle von accuse Ich möchte die find() Abfrage, um das Dokument (Datensatz/Zeile) zu dem Wort accuse .

Ich habe dies versucht, was überhaupt nicht funktioniert, es werden keine Ergebnisse zurückgegeben.

collection.find({"word":{"$in":{"$regex":words}}})

Jedes Element des Arrays wird mit ^ vor dem Wort, z.B.. ['^work', '^accus', '^planet']

Gehe ich die Sache nur falsch an?

14voto

vissi Punkte 2356

Entschuldigung für die späte Antwort, habe gerade Ihre Frage gegoogelt. Sie sollten eine Regex verwenden, nicht ein Array von ihnen, wie:

'^[work|accus*|planet]'

4voto

Som Punkte 307

Sie können nicht verwenden $regex innerhalb einer $in Ausdruck, aber Sie können JS regex (die Art "/regex/") verwenden.

Aus den MongoDB-Dokumenten unter http://docs.mongodb.org/v2.2/reference/operator/query/regex/#in-expressions :

Um einen regulären Ausdruck in einen $in-Abfrageausdruck einzuschließen, können Sie nur JavaScript-Objekte für reguläre Ausdrücke verwenden (d. h. /pattern/ ). Sie können keine $regex-Operator-Ausdrücke innerhalb eines $in verwenden.

Übrigens, ich weiß, dass diese Antwort sehr spät kommt, aber ich hoffe, dass sie den zukünftigen Anfragern helfen wird...

1voto

uris Punkte 5769

Mit Spring Data API kann man die Abfrage wie folgt durchführen:

Query query = new Query();
query.addCriteria(Criteria.where("words").in(Pattern.compile(regex-String)));
find(query)

Dies findet alle Dokumente mit einem Array-Feld namens words mit Elementen in diesem Array, die mit dem Regex übereinstimmen.

1voto

Yaki Klein Punkte 3152

Laut Mongo docs Der richtige Weg dazu ist der folgende

var words = [/hello/, /^world/];// array of regex
db.getCollection('word collection').find({"word" : {$in : words}});

Dies soll erreicht werden durch JS können Sie ein Array von RegEXp Objekte und übergeben dieses Array als Wert von $in so etwas wie das hier:

words = words.map(function(v){return new RegExp(v)});

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X