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

udtrække subarray-værdi i mongodb

Du har en vis syntaks i dit originale eksempel, som sandsynligvis ikke gør, hvad du forventer .. det ser ud til, at din hensigt kun var at matche scores for en bestemt type ('eksamen' i dit eksempel, 'quiz' ved din beskrivelse ).

Nedenfor er nogle eksempler på brug af MongoDB 2.2 shell.

$elemMatch projektion

Du kan bruge $elemMatch-projektionen for at returnere det første matchende element i et array:

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

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

Resultatet vil være det matchende element i arrayet for hvert dokument, f.eks.:

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

Aggregation Framework

Hvis du vil vise mere end én matchende værdi eller omforme resultatdokumentet i stedet for at returnere det fulde matchende array-element, kan du bruge 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 dette tilfælde inkluderer ville være:

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



  1. sorter mongo-samling baseret på antallet af børnedokumenter

  2. Langsom MongoDB-forespørgsel:kan du forklare hvorfor?

  3. Hvorfor opretter mongoDB Node-driver uønskede forbindelser?

  4. Hent data fra MongoDB-samling til Swing JTable