sql >> Base de Datos >  >> NoSQL >> MongoDB

extraer el valor del subarreglo en mongodb

Tiene algo de sintaxis en su ejemplo original que probablemente no está haciendo lo que espera... es decir, parece que su intención era solo hacer coincidir puntajes para un tipo específico ('examen' en su ejemplo, 'cuestionario' por su descripción ).

A continuación se muestran algunos ejemplos que utilizan el shell MongoDB 2.2.

$elemMatch proyección

Puede usar la proyección $elemMatch para devolver el primer elemento coincidente en una matriz:

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

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

El resultado será el elemento coincidente de la matriz para cada documento, por ejemplo:

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

Marco de agregación

Si desea mostrar más de un valor coincidente o remodelar el documento de resultados en lugar de devolver el elemento de matriz coincidente completo, puede usar Marco de agregación :

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

El resultado en este caso incluye sería:

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