it-swarm.com.de

Dokument mit einem Array suchen, das einen bestimmten Wert enthält

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.

375

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]
}
549
JohnnyHK

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"]} }, ...);
119
Alistair Nelson

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/

57
Pobe

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"});
30
Kfir Erez

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 }
})
30
Jesus Campon

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} }
            ]);
1
Amitesh

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]}}}

1
Mark Ryan Orosa

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);
}
0
Alingenomen

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}
0
user1538016