sql >> Databasteknik >  >> NoSQL >> MongoDB

Mongo-fråga på flera fält av underdokument

Detta är faktiskt vad $elemMatch operatör är för även om den ofta missbrukas. Den utför i huvudsak frågevillkoren för varje element "inom" arrayen. Alla MongoDB-argument är en "och"-operation om inte annat uttryckligen kallas:

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

Du vill förmodligen också "projektera" här också om du bara förväntar dig det matchade fältet och inte hela dokumentet:

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

Slutligen för att förklara varför ditt andra försök inte fungerar, denna fråga:

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

Matchar ingenting eftersom det inte finns något verkligt dokument där "arr" innehåller ett singularelement som exakt matchar dina villkor.

Ditt första exempel misslyckades...:

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

Eftersom det finns flera arrayelement som uppfyller villkoren och detta anses inte bara att båda villkoren gäller för samma element. Det är vad $elemMatch lägger till, och när du behöver mer än ett villkor för att matcha, då är det här du använder det.




  1. Kan inte ansluta till docker mongo

  2. MongoDB Datakatalog /data/db hittades inte

  3. Indirekt ändring av överbelastad egendom Laravel MongoDB

  4. Couchbase benchmark avslöjar mycket långsamma INSERTs och GETs (med hjälp av KeyValue-operationer); långsammare än kvarvarande MySQL-data