sql >> Database >  >> NoSQL >> MongoDB

Mongo-query op meerdere velden van subdocument

Dit is eigenlijk wat de $elemMatch operator is voor ook al wordt het vaak misbruikt. Het voert in wezen de queryvoorwaarden uit op elk element "binnen" de array. Alle MongoDB-argumenten zijn een "en"-bewerking, tenzij expliciet anders genoemd:

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

U wilt hier waarschijnlijk ook "projecteren" als u alleen het overeenkomende veld verwacht en niet dat hele document:

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

Ten slotte om uit te leggen waarom uw tweede poging niet werkt, deze vraag:

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

Komt met niets overeen omdat er geen echt document is waarin "arr" een enkelvoudig element bevat dat exact overeenkomt met uw voorwaarden.

Je eerste voorbeeld is mislukt..:

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

Omdat er meerdere array-elementen zijn die aan de voorwaarden voldoen en daarbij wordt niet zomaar aangenomen dat beide voorwaarden van toepassing zijn op hetzelfde element. Dat is wat $elemMatch voegt toe, en als je meer dan één voorwaarde nodig hebt om te voldoen, dan is dit waar je het gebruikt.




  1. mongodb multi vasthoudendheid spel met @Document

  2. MongoDB C# Driver en server gegenereerde ObjectIds

  3. Elastisch zoeken met MongoDB :PDF's zoeken

  4. Correcte manier om een ​​verzameling te sharden en hoe de resultaten te interpreteren