sql >> Databasteknik >  >> NoSQL >> MongoDB

$projection vs $elemMatch

Skillnaden i projektionsanvändning är något subtil. I din exempelanvändning bör dessa vara likvärdiga frågor (när det gäller indexanvändning) men $elemMatch exemplet upprepar frågekriterierna i onödan. $ projektion skulle vara ett mer förnuftigt val för detta exempel.

En väsentlig skillnad som noteras i dokumentationen är arrayen fältbegränsning för $ projektioner:

Några ytterligare anteckningar om skillnaderna i projektionsoperatorerna nedan ...

Den positionella ($ ) projektionsoperatör :

  • begränsar innehållet i ett matrisfält som ingår i frågeresultaten till att innehålla det första elementet som matchar frågedokumentet.

  • kräver att det matchande matrisfältet ingår i frågekriterierna

  • kan endast användas om ett enstaka matrisfält visas i frågekriterierna

  • kan bara användas en gång i en projektion

$elemMatch projektionsoperatör

  • begränsar innehållet i ett matrisfält som ingår i frågeresultaten till att endast innehålla det första matriselementet som matchar $elemMatch-villkoret .

  • kräver inte att den matchande matrisen finns i frågekriterierna

  • kan användas för att matcha flera villkor för arrayelement som är inbäddade dokument

$elemMatch frågeoperator

Observera att det också finns en $elemMatch frågeoperator som utför liknande matchning, men i frågan snarare än resultatprojektionen. Det är inte ovanligt att detta används i kombination med en $ projektion.

Lånar ett exempel från dokumenten där du kan använda båda:

db.students.find(
    // use $elemMatch query operator to match multiple criteria in the grades array
    { grades: {
        $elemMatch: {
            mean:  { $gt: 70 },
            grade: { $gt: 90 }
        }
    }},

    // use $ projection to get the first matching item in the "grades" array
    { "grades.$": 1 }
)


  1. hitta och räkna i en enda mongodb-fråga

  2. MongoDB hittar kapslade objekt som uppfyller kriterierna

  3. Sparar resultatet av en MongoDB-fråga

  4. GridFSDBFile i vårstart 2.0.1 release