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)

9voto

gautam Punkte 384

Im Falle, dass lookup_food_array ein Array ist.

match_stage["favoriteFoods"] = {'$elemMatch': {'$in': lookup_food_array}}

Im Falle, dass lookup_food_array ein String ist.

match_stage["favoriteFoods"] = {'$elemMatch': lookup_food_string}

7voto

Es gibt einige Möglichkeiten, dies zu erreichen. Der erste Weg ist mit dem $elemMatch-Operator:

const docs = await Documents.find({category: { $elemMatch: {$eq: 'yourCategory'} }});
// Möglicherweise müssen Sie 'yourCategory' in ObjectId konvertieren

Der zweite Weg ist mit den Operatoren $in oder $all:

const docs = await Documents.find({category: { $in: [yourCategory] }});

oder

const docs = await Documents.find({category: { $all: [yourCategory] }});
// Sie können mit diesen beiden Ansätzen mehrere Kategorien angeben
// und wieder müssen Sie yourCategory in ObjectId konvertieren

$in ist wie ein OR und $all wie ein AND. Weitere Details finden Sie unter diesem link: https://docs.mongodb.com/manual/reference/operator/query/all/

Der dritte Weg ist mit der aggregate()-Funktion:

const docs = await Documents.aggregate([
    { $unwind: '$category' },
    { $match: { 'category': mongoose.Types.ObjectId(yourCategory) } }
]};

Mit der aggregate()-Funktion erhalten Sie nur eine Kategorie-ID in Ihrem Kategorie-Array.

Ich habe diese Code-Schnipsel aus meinen Projekten, in denen ich Dokumente mit bestimmten Kategorien finden musste. Sie können sie einfach an Ihre Bedürfnisse anpassen.

4voto

Amitesh Bharti Punkte 10156

Auch wenn find() in Ihrem Anwendungsfall am effektivsten ist. Es gibt immer noch $match im 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 besonders wertvoll sind, insbesondere für Gruppierungen und das Erstellen neuer Dateien.

  PersonModel.aggregate([
            { 
                 "$match": { 
                     $and : [{ 'favouriteFoods' : { $exists: true, $in: [ 'sushi']}}, ........ ]  }
             },
             { $project : {"_id": 0, "name" : 1} }
            ]);

2voto

Mark Ryan Orosa Punkte 837

Für Loopback3 haben mir alle gegebenen Beispiele nicht funktioniert, oder zumindest nicht so schnell wie die Verwendung der REST-API. Aber es hat mir geholfen, die genaue Antwort herauszufinden, die ich brauchte.

{"where":{"arrayAttribute":{ "all" :[String]}}}

2voto

chavy Punkte 558

Wenn Sie in einem Array von Objekten suchen, können Sie $elemMatch verwenden. Zum Beispiel:

PersonModel.find({ favoriteFoods : { $elemMatch: { name: "sushiOrAnytthing" }}});

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