sql >> Database >  >> NoSQL >> MongoDB

extraheer subarray-waarde in mongodb

Je hebt een syntaxis in je originele voorbeeld die waarschijnlijk niet doet wat je verwacht ... dat wil zeggen, het lijkt erop dat het je bedoeling was om alleen scores voor een specifiek type te matchen ('examen' in je voorbeeld, 'quiz' door je beschrijving ).

Hieronder staan ​​enkele voorbeelden waarin de MongoDB 2.2-shell wordt gebruikt.

$elemMatch projectie

U kunt de $elemMatch-projectie gebruiken om het eerste overeenkomende element in een array te retourneren:

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

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

Het resultaat is het overeenkomende element van de array voor elk document, bijvoorbeeld:

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

Aggregatieraamwerk

Als u meer dan één overeenkomende waarde wilt weergeven of het resultaatdocument een nieuwe vorm wilt geven in plaats van het volledige overeenkomende array-element te retourneren, kunt u de Aggregatieraamwerk :

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

Het resultaat in dit geval zou zijn:

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



  1. MongoDB $nin Query-operator

  2. is er een mangoest verbindingsfout callback

  3. NodeJS logt alle gebruikerssessies uit

  4. MongoDB:zoekopdrachten voor meerdere collecties