提取mongodb的子阵列值(extract subarray value in mongodb)

2019-08-02 22:51发布

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
            }
        ]
    }

我怎么只显示通过蒙戈外壳测验分数?

Answer 1:

你在你原来的例子一些语法这可能不是做你的期望..也就是说,它看起来像你的意图是只有在你的榜样通过你的描述相符的分数为特定类型(“考试”,“小测验” )。

下面是使用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 } ] }

聚合框架

如果你想显示多个匹配值或重塑的结果文档而不用返回整个匹配数组元素,你可以使用聚合框架 :

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 }


文章来源: extract subarray value in mongodb