MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

estrarre il valore di sottoarray in mongodb

Hai una sintassi nel tuo esempio originale che probabilmente non sta facendo quello che ti aspetti .. cioè, sembra che il tuo intento fosse solo quello di abbinare i punteggi per un tipo specifico ("esame" nel tuo esempio, "quiz" dalla tua descrizione ).

Di seguito sono riportati alcuni esempi di utilizzo della shell MongoDB 2.2.

$elemMatch proiezione

Puoi utilizzare la proiezione $elemMatch per restituire il primo elemento corrispondente in un array:

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

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

Il risultato sarà l'elemento corrispondente dell'array per ogni documento, ad esempio:

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

Quadro di aggregazione

Se desideri visualizzare più di un valore corrispondente o rimodellare il documento risultante invece di restituire l'intero elemento dell'array corrispondente, puoi utilizzare Quadro di aggregazione :

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

Il risultato in questo caso include sarebbe:

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