696 Stimmen

Finden Sie ein Dokument mit einem Array, das einen bestimmten Wert enthält

Wenn ich dieses Schema habe...

person = {
    name : String,
    favoriteFoods : Array
}

... wo das favoriteFoods Array mit Strings gefüllt ist. Wie kann ich alle Personen finden, die "Sushi" als Lieblingsessen haben, unter Verwendung von Mongoose?

Ich hatte auf etwas Ähnliches gehofft:

PersonModel.find({ favoriteFoods : { $contains : "sushi" }, function(...) {...});

(Ich weiß, dass es kein $contains in mongodb gibt, erkläre nur, was ich erwartet habe, bevor ich die Lösung kannte)

966voto

JohnnyHK Punkte 289697

Da favouriteFoods ein einfaches Array von Zeichenketten ist, können Sie einfach dieses Feld direkt abfragen:

PersonModel.find({ favouriteFoods: "sushi" }, ...); // favouriteFoods enthält "sushi"

Aber ich empfehle auch, das Zeichenkettenarray in Ihrem Schema explizit zu machen:

person = {
    name : String,
    favouriteFoods : [String]
}

Die relevante Dokumentation finden Sie hier: https://docs.mongodb.com/manual/tutorial/query-arrays/

231voto

Alistair Nelson Punkte 3125

Es gibt keinen $contains Operator in mongodb.

Sie können die Antwort von JohnnyHK verwenden, da sie funktioniert. Die nächste Analogie zu contains, die mongo hat, ist $in, und so würde Ihre Abfrage aussehen:

PersonModel.find({ favouriteFoods: { "$in" : ["sushi"]} }, ...);

152voto

Pobe Punkte 2435

Ich denke, dass $all in dieser Situation angemessener wäre. Wenn Sie nach Personen suchen, die auf Sushi stehen, tun Sie Folgendes:

PersonModel.find({ favoriteFood : { $all : ["sushi"] }, ...})

Vielleicht möchten Sie Ihre Suche weiter filtern, zum Beispiel so:

PersonModel.find({ favoriteFood : { $all : ["sushi", "bananas"] }, ...})

$in ist wie ODER und $all wie UND. Hier finden Sie weitere Informationen: https://docs.mongodb.com/manual/reference/operator/query/all/

117voto

Kfir Erez Punkte 2980

Falls das Array Objekte enthält, zum Beispiel wenn favouriteFoods ein Array von Objekten der folgenden Art ist:

{
  name: 'Sushi',
  type: 'Japanese'
}

kannst du die folgende Query verwenden:

PersonModel.find({"favouriteFoods.name": "Sushi"});

34voto

Jesus Campon Punkte 412

Wenn Sie Dokumente finden 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 query array with null values

Es war eine großartige Entdeckung und es funktioniert viel besser als meine eigene anfängliche und falsche Version (die sich nur für Arrays mit einem Element als funktionstüchtig herausstellte):

.find({
    'MyArrayOfSubDocuments': { $not: { $size: 0 } },
    'MyArrayOfSubDocuments._id': { $exists: false }
})

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