MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

$projection contre $elemMatch

La différence dans l'utilisation de la projection est quelque peu subtile. Dans votre exemple d'utilisation, il devrait s'agir de requêtes équivalentes (en termes d'utilisation de l'index), mais le $elemMatch exemple répète inutilement les critères de la requête. Le $ projection serait un choix plus judicieux pour cet exemple.

Une différence essentielle notée dans la documentation est le tableau array limitation de champ pour $ projection :

Quelques notes supplémentaires sur les différences dans les opérateurs de projection ci-dessous ...

Le positionnel ($ ) opérateur de projection :

  • limite le contenu d'un champ de tableau inclus dans les résultats de la requête pour qu'il contienne le premier élément qui correspond au document de requête.

  • nécessite que le champ de tableau correspondant soit inclus dans les critères de requête

  • ne peut être utilisé que si un seul champ de tableau apparaît dans les critères de requête

  • ne peut être utilisé qu'une seule fois dans une projection

Le $elemMatch opérateur de projection

  • limite le contenu d'un champ de tableau inclus dans les résultats de la requête pour qu'il ne contienne que le premier élément de tableau qui correspond à la condition $elemMatch .

  • ne nécessite pas que le tableau correspondant soit dans les critères de requête

  • peut être utilisé pour faire correspondre plusieurs conditions pour les éléments de tableau qui sont des documents intégrés

Le $elemMatch opérateur de requête

Notez qu'il existe également un $elemMatch opérateur de requête qui effectue une correspondance similaire, mais dans la requête plutôt que dans la projection des résultats. Il n'est pas rare de voir ceci utilisé en combinaison avec un $ projection.

Emprunter un exemple de la documentation où vous pourriez utiliser les deux :

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