Wenn ich dieses Schema habe ...
person = {
name : String,
favoriteFoods : Array
}
... wo das favoriteFoods
-Array mit Strings aufgefüllt wird. Wie finde ich alle Personen, die "Sushi" als Lieblingsessen mit Mungo haben?
Ich hoffte auf etwas in der Art von:
PersonModel.find({ favoriteFoods : { $contains : "sushi" }, function(...) {...});
(Ich weiß, dass es in mongodb keinen $contains
gibt, der nur erklärt, was ich erwartet hatte, bevor er die Lösung wusste.
Da favouriteFoods
ein einfaches Array von Strings ist, können Sie dieses Feld einfach direkt abfragen:
PersonModel.find({ favouriteFoods: "sushi" }, ...);
Ich würde aber auch empfehlen, das String-Array in Ihrem Schema explizit zu machen:
person = {
name : String,
favouriteFoods : [String]
}
In mongodb ist kein $contains
-Operator vorhanden.
Sie können die Antwort von JohnnyHK verwenden, da dies funktioniert. Die beste Analogie, die mongo enthält, ist $in
. Ihre Abfrage würde folgendermaßen aussehen:
PersonModel.find({ favouriteFoods: { "$in" : ["sushi"]} }, ...);
Ich denke, dass $all
in dieser Situation angemessener wäre. Wenn Sie nach einer Person suchen, die Sushi liebt, tun Sie Folgendes:
PersonModel.find({ favoriteFood : { $all : ["sushi"] }, ...})
Vielleicht möchten Sie Ihre Suche auch weiter filtern:
PersonModel.find({ favoriteFood : { $all : ["sushi", "bananas"] }, ...})
$in
ist wie OR und $all
wie AND. Überprüfen Sie dies: https://docs.mongodb.com/manual/reference/operator/query/all/
Wenn das Array Objekte enthält, zum Beispiel, wenn favouriteFoods
ein Array von Objekten der folgenden Art ist:
{
name: 'Sushi',
type: 'Japanese'
}
sie können die folgende Abfrage verwenden:
PersonModel.find({"favouriteFoods.name": "Sushi"});
Falls Sie Dokumente suchen müssen, die NULL-Elemente in einem Array von Unterdokumenten enthalten, habe ich diese Abfrage gefunden, die ziemlich gut funktioniert:
db.collection.find({"keyWithArray":{$elemMatch:{"$in":[null], "$exists":true}}})
Diese Abfrage stammt aus diesem Beitrag: MongoDb-Abfrage-Array mit Nullwerten
Es war eine großartige Entdeckung und sie funktioniert viel besser als meine erste - und falsche -Version (die sich nur für Arrays mit einem Element als gut herausstellte):
.find({
'MyArrayOfSubDocuments': { $not: { $size: 0 } },
'MyArrayOfSubDocuments._id': { $exists: false }
})
Stimmt jedoch mit find () überein, ist es am effektivsten in Ihrer Anwendung. Es gibt jedoch immer noch $ match of Aggregation Framework, um die Abfrage einer großen Anzahl von Einträgen zu erleichtern und eine geringe Anzahl von Ergebnissen zu generieren, die für Sie von besonderem Wert sind, insbesondere beim Gruppieren und Erstellen neuer Dateien.
PersonModel.aggregate([ { "$match": { $and : [{ 'favouriteFoods' : { $exists: true, $in: [ 'sushi']}}, ........ ] } }, { $project : {"_id": 0, "name" : 1} } ]);
Für Loopback3 funktionierten alle Beispiele nicht oder für mich so schnell wie die Verwendung von REST API. Aber es half mir, die genaue Antwort herauszufinden, die ich brauchte.
{"where":{"arrayAttribute":{ "all" :[String]}}}
Wenn Sie etwas wie einen "enthaltenden" Operator über Javascript verwenden möchten, können Sie dafür immer einen regulären Ausdruck verwenden ...
beispiel: Sie möchten einen Kunden mit dem Namen "Bartolomew" abrufen
async function getBartolomew() {
const custStartWith_Bart = await Customers.find({name: /^Bart/ }); // Starts with Bart
const custEndWith_lomew = await Customers.find({name: /lomew$/ }); // Ends with lomew
const custContains_rtol = await Customers.find({name: /.*rtol.*/ }); // Contains rtol
console.log(custStartWith_Bart);
console.log(custEndWith_lomew);
console.log(custContains_rtol);
}
Ein Fall von lookup_food_array ist array.
match_stage["favoriteFoods"] = {'$elemMatch': {'$in': lookup_food_array}}
Ein Fall von lookup_food_array ist string.
match_stage["favoriteFoods"] = {'$elemMatch': lookup_food_string}