Wenn ich dieses Schema habe ...
person = {
name : String,
favoriteFoods : Array
}
... wo das favoriteFoods
Array mit Strings gefüllt ist. Wie kann ich mit Mungo alle Personen finden, die "Sushi" als Lieblingsessen haben?
Ich hoffte auf etwas in der Art von:
PersonModel.find({ favoriteFoods : { $contains : "sushi" }, function(...) {...});
(Ich weiß, dass es $contains
in Mongodb kein gibt, nur zu erklären, was ich erwartet hatte, bevor ich die Lösung kannte )
favouriteFoods
:favouriteFoods:[{type:Schema.Types.ObjectId, ref:'Food'}]
PersonModel.find({ favouriteFoods.text: "sushi" }, ...); person = { name : String, favouriteFoods : [{text:String}] }
Es gibt keinen
$contains
Operator in Mongodb.Sie können die Antwort von JohnnyHK verwenden, da dies funktioniert. Die nächste Analogie zu den Inhalten von Mongo lautet
$in
: Wenn Sie diese verwenden, würde Ihre Abfrage folgendermaßen aussehen:quelle
$in
wird verwendet, wenn Sie mehrere Abfragewerte haben und das Dokument mit einem von ihnen übereinstimmen muss. Umgekehrt (worum es in dieser Frage geht) ist die Antwort von JohnnyHK richtig. Ich wollte abstimmen, aber ich denke, diese Antwort kann für andere Leute hilfreich sein, die auf dieser Seite landen.PersonModel.find({favouriteFoods: {"$in": ["sushi", "hotdog"]}})
Ich denke,
$all
wäre in dieser Situation angemessener. Wenn Sie nach einer Person suchen, die Sushi mag, tun Sie Folgendes:Da Sie Ihre Suche möglicherweise stärker filtern möchten, gehen Sie wie folgt vor:
$in
ist wie ODER und$all
wie UND. Überprüfen Sie dies: https://docs.mongodb.com/manual/reference/operator/query/all/quelle
Für den Fall, dass das Array Objekte enthält, z. B. wenn
favouriteFoods
es sich um ein Array von Objekten der folgenden Art handelt:Sie können die folgende Abfrage verwenden:
quelle
Für den Fall, dass Sie Dokumente finden müssen, die NULL-Elemente in einem Array von Unterdokumenten enthalten, habe ich diese Abfrage gefunden, die ziemlich gut funktioniert:
Diese Abfrage stammt aus diesem Beitrag: MongoDb-Abfragearray mit Nullwerten
Es war eine großartige Entdeckung und funktioniert viel besser als meine eigene ursprüngliche und falsche Version (die sich nur für Arrays mit einem Element als gut herausstellte):
quelle
Obwohl Sie mit find () einverstanden sind, ist dies in Ihrem Anwendungsfall am effektivsten. Trotzdem gibt es ein $ match of Aggregation Framework, um die Abfrage einer großen Anzahl von Einträgen zu vereinfachen und eine geringe Anzahl von Ergebnissen zu generieren, die für Sie besonders für das Gruppieren und Erstellen neuer Dateien von Wert sind.
quelle
Der Fall von lookup_food_array ist ein Array.
Der Fall von lookup_food_array ist eine Zeichenfolge.
quelle
Für Loopback3 funktionierten alle angegebenen Beispiele nicht oder so schnell wie die Verwendung der REST-API. Aber es half mir, die genaue Antwort herauszufinden, die ich brauchte.
{"where":{"arrayAttribute":{ "all" :[String]}}}
quelle
Wenn Sie so etwas wie einen "enthält" -Operator über Javascript verwenden möchten, können Sie dafür immer einen regulären Ausdruck verwenden ...
z.B. Angenommen, Sie möchten einen Kunden mit dem Namen "Bartolomew" abrufen
quelle
Ich weiß, dass dieses Thema alt ist, aber für zukünftige Leute, die sich die gleiche Frage stellen könnten, könnte eine andere unglaublich ineffiziente Lösung sein:
Dies vermeidet alle Optimierungen durch MongoDB und wird daher nicht im Produktionscode verwendet.
quelle