sql >> Databáze >  >> NoSQL >> MongoDB

extrahujte hodnotu subarray v mongodb

Ve svém původním příkladu máte nějakou syntaxi, která pravděpodobně nedělá to, co očekáváte. To znamená, že to vypadá, že vaším záměrem bylo přiřadit skóre pouze pro konkrétní typ („zkouška“ ve vašem příkladu, „kvíz“ podle vašeho popisu ).

Níže jsou uvedeny některé příklady použití prostředí MongoDB 2.2.

$elemMatch projekce

Můžete použít projekci $elemMatch vrátit první odpovídající prvek v poli:

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

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

Výsledkem bude odpovídající prvek pole pro každý dokument, např.:

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

Agregační rámec

Chcete-li zobrazit více než jednu odpovídající hodnotu nebo změnit tvar výsledného dokumentu namísto vracení úplného shodného prvku pole, můžete použít Agregační rámec :

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

Výsledkem v tomto případě by bylo:

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



  1. Jak získat přístup k již existující sbírce pomocí Mongoose?

  2. Problémy s @Qualifier

  3. Odstraňte dokumenty z kolekce MongoDB na základě času v poli Datum

  4. Mongodb:Najít všechny dokumenty, kde alespoň jeden prvek pole neodpovídá?