8

ここにMongoDB初心者...

私は次のようなコレクションを持っています...

    > db.students.find({_id:22},{scores:[{type:'exam'}]}).pretty()
    {
        "_id" : 22,
        "scores" : [
            {
                "type" : "exam",
                "score" : 75.04996547553947
            },
            {
                "type" : "quiz",
                "score" : 10.23046475899236
            },
            {
                "type" : "homework",
                "score" : 96.72520512117761
            },
            {
                "type" : "homework",
                "score" : 6.488940333376703
            }
        ]
    }

mongo シェル経由でクイズのスコアのみを表示するにはどうすればよいですか?

4

1 に答える 1

24

元の例には、おそらく期待どおりの構文がありません..つまり、特定のタイプのスコアのみを一致させることを意図していたようです(例では「試験」、説明では「クイズ」) )。

以下は、MongoDB 2.2 シェルを使用した例です。

$elemMatch投影

$elemMatch プロジェクションを使用して、配列内の最初に一致する要素を返すことができます。

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

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

結果は、各ドキュメントの配列の一致する要素になります。たとえば、次のようになります。

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

集計フレームワーク

完全に一致する配列要素を返すのではなく、複数の一致する値を表示したり、結果ドキュメントを再形成したりする場合は、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"
    }}
)

この場合の結果は次のようになります。

{ "result" : [ { "score" : 75.04996547553947 } ], "ok" : 1 }
于 2012-11-19T12:12:48.677 に答える