MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Subarray-Wert in Mongodb extrahieren

Sie haben eine Syntax in Ihrem ursprünglichen Beispiel, die wahrscheinlich nicht das tut, was Sie erwarten ).

Nachfolgend finden Sie einige Beispiele für die Verwendung der MongoDB 2.2-Shell.

$elemMatch Projektion

Sie können die $elemMatch-Projektion verwenden um das erste übereinstimmende Element in einem Array zurückzugeben:

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

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

Das Ergebnis ist das passende Element des Arrays für jedes Dokument, zB:

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

Aggregations-Framework

Wenn Sie mehr als einen übereinstimmenden Wert anzeigen oder das Ergebnisdokument umformen möchten, anstatt das vollständige übereinstimmende Array-Element zurückzugeben, können Sie den Aggregation Framework :

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

Das Ergebnis in diesem Fall wäre:

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