MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Mongo-Abfrage in mehreren Feldern eines untergeordneten Dokuments

Das ist eigentlich das, was der $elemMatch Operator ist für, obwohl er oft missbraucht wird. Es führt im Wesentlichen die Abfragebedingungen für jedes Element "innerhalb" des Arrays aus. Alle MongoDB-Argumente sind eine „und“-Operation, sofern nicht ausdrücklich anders aufgerufen:

db.collection.find({ "arr": { "$elemMatch": { "name": "b", "num": 2  } } })

Wahrscheinlich möchten Sie auch hier "projizieren", wenn Sie nur das übereinstimmende Feld und nicht das gesamte Dokument erwarten:

db.collection.find(
    { "arr": { "$elemMatch": { "name": "b", "num": 2  } } },
    { "arr.$": 1 }
)

Um schließlich zu erklären, warum Ihr zweiter Versuch nicht funktioniert, diese Abfrage:

db.collection.find({
    "arr": [
        { "name": "b", "num": 2 }
    ]
})

Stimmt mit nichts überein, da es kein tatsächliches Dokument gibt, in dem "arr" ein singuläres Element enthält, das genau Ihren Bedingungen entspricht.

Ihr erstes Beispiel ist fehlgeschlagen..:

db.collection.find({
    $and: [
        { "arr.name": "b" },
        { "arr.num": 2 }
    ]
});

Da es mehrere Array-Elemente gibt, die die Bedingungen erfüllen und dies nicht gerade berücksichtigt wird, gelten beide Bedingungen für dasselbe Element. Das ist $elemMatch fügt hinzu, und wenn Sie mehr als eine Bedingung erfüllen müssen, dann verwenden Sie sie hier.