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

extraire la valeur du sous-tableau dans mongodb

Vous avez une syntaxe dans votre exemple d'origine qui ne fait probablement pas ce que vous attendez .. c'est-à-dire qu'il semble que votre intention était de ne faire correspondre les scores que pour un type spécifique ("examen" dans votre exemple, "quiz" par votre description ).

Vous trouverez ci-dessous quelques exemples utilisant le shell MongoDB 2.2.

$elemMatch projection

Vous pouvez utiliser la projection $elemMatch pour renvoyer le premier élément correspondant dans un tableau :

db.students.find(
    // Search criteria
    { '_id': 22 },

    // Projection
    { _id: 0, scores: { $elemMatch: { type: 'exam' } }}
)

Le résultat sera l'élément correspondant du tableau pour chaque document, par exemple :

{ "scores" : [ { "type" : "exam", "score" : 75.04996547553947 } ] }

Cadre d'agrégation

Si vous souhaitez afficher plusieurs valeurs correspondantes ou remodeler le document de résultat au lieu de renvoyer l'élément de tableau correspondant complet, vous pouvez utiliser le Framework d'agrégation :

db.students.aggregate(
    // Initial document match (uses index, if a suitable one is available)
    { $match: {
        '_id': 22, 'scores.type' : 'exam'
    }},

    // Convert embedded array into stream of documents
    { $unwind: '$scores' },

    // Only match scores of interest from the subarray
    { $match: {
        'scores.type' : 'exam'
    }},

    // Note: Could add a `$group` by _id here if multiple matches are expected

    // Final projection: exclude fields with 0, include fields with 1
    { $project: {
        _id: 0,
        score: "$scores.score"
    }}
)

Le résultat dans ce cas inclut serait :

{ "result" : [ { "score" : 75.04996547553947 } ], "ok" : 1 }