mongodb - 在 mongodb 投影中组合 $elemMatch 和 $

标签 mongodb mongodb-query aggregation-framework

我的 MongoDB 集合中有以下文档:

{ "_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" }
            }
        }
    ])

关于mongodb - 在 mongodb 投影中组合 $elemMatch 和 $,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29205253/

相关文章:

node.js - if else if cond in mongodb 聚合

java - 无法在 mongoTemplate springboot 中使用排序规则

Node.js 上的 MongoDB 'error: non ascii character detected'

mongodb - 在 mongo 中,只有当记录尚不存在时,我才能插入记录

mongodb - 查询通过从当前文档和下一个文档中减去一个值来获取一个值

javascript - 如何通过条件嵌套对象数组来检索文档?

node.js - MongoClient抛出MongoError : server instance pool was destroyed

javascript - 如何将正常时间戳转换为 BSON 时间戳?

MongoDB 聚合时间序列

java - 如何使用 MongoDB Java 驱动程序按 ISODate 属性上的 dayOfYear 进行分组?