sql >> Databasteknik >  >> NoSQL >> MongoDB

extrahera subarray-värde i mongodb

Du har viss syntax i ditt ursprungliga exempel som förmodligen inte gör som du förväntar dig .. det vill säga, det verkar som att din avsikt var att bara matcha poäng för en specifik typ ('prov' i ditt exempel, 'quiz' enligt din beskrivning ).

Nedan finns några exempel med MongoDB 2.2-skalet.

$elemMatch projektion

Du kan använda $elemMatch-projektionen för att returnera det första matchande elementet i en array:

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

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

Resultatet blir det matchande elementet i arrayen för varje dokument, t.ex.:

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

Aggregation Framework

Om du vill visa mer än ett matchande värde eller omforma resultatdokumentet istället för att returnera hela matchande array-elementet, kan du använda 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"
    }}
)

Resultatet i detta fall inkluderar skulle vara:

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



  1. MongoDB databas schema design

  2. Användarinloggning fungerar inte med node.js och mongoose

  3. En översikt över WiredTiger Storage Engine för MongoDB

  4. XFS vs EXT4 – Jämföra MongoDB-prestanda på AWS EC2