在 mongodb 投影中结合 $elemMatch 和 $

Combining $elemMatch and $ in mongodb projection

我的 MongoDB collection 中有以下文件:

{ "_id" : 1, "semester" : 1, "grades" : [ 70, 87, 90 ] }
{ "_id" : 2, "semester" : 2, "grades" : [ 90, 88, 92 ] }
{ "_id" : 3, "semester" : 1, "grades" : [ 85, 100, 90 ] }

我想检索所有匹配第一个学期的文件,并为每个文件提供 id 字段、学期字段和大于 80 的一年级。 即,对于上面的文档,查询的结果应该是:

{ "_id" : 1, "semester" : 1, "grades" : 87 }
{ "_id" : 3, "semester" : 1, "grades" : 85 }

这可能吗? 执行此操作的查询是什么(我使用的是 MongoDB 2.6)? 我知道如何使用 $elemMatch 进行投影来显示所有大于 80 的成绩,或者如何使用“$”运算符仅显示一年级,但我如何将它们组合起来以选择其中的第一个?

您可以使用 aggregation pipeline

    db.collection.aggregate([
        { "$unwind": "$grades" }, 
        { "$match": 
            {
                "semester": 1, 
                "grades": { "$gt": 80 }
            }
        }, 
        { "$group": 
            { 
                "_id": "$_id", 
                "semester": { "$first": "$semester" }, 
                "grades": { "$first": "$grades" }
            }
        }
    ])