mongodb - 如何在 Mongodb 中按月份和年份范围进行过滤

标签 mongodb mongodb-query spring-data-mongodb

我的文档如下所示:

{
     id: "abc",
     value: 1234,
     month: 6,
     year: 2018
}

如何在聚合中过滤掉如下查询:

{
     from: "6/2017",
     to: "8/2018"
}

最佳答案

我自己得到的:

db.bills.aggregate([
{
    $match: {
        $expr: {
            $or: [
                {
                    $and: [
                        {$eq: ["$year", FROMYEAR]},
                        {$eq: ["$year", TOYEAR]},
                        {$gte: ["$month", FROMMONTH},
                        {$lte: ["$month", TOMONTH},
                    ]
                },
                {
                    $and: [
                        {$eq: ["$year", FROMYEAR]},
                        {$lt: ["$year", TOYEAR]},
                        {$gte: ["$month", FROMMONTH]}
                    ]
                },
                {
                    $and: [
                        {$gt: ["$year", FROMYEAR]},
                        {$eq: ["$year", TOYEAR]},
                        {$lte: ["$month", TOMONTH]}
                    ]
                },
                {
                    $and: [
                        {$gt: ["$year", FROMYEAR]},
                        {$lt: ["$year", TOYEAR]}
                    ]
                }
            ]
        }
    }
},
{
    $project: {
        "id": 1,
        "month": 1,
        "year": 1,
        "_id": 0
    }
},
,
{
    $sort: {
        "year": 1,
        "month": 1
    }
}
]).toArray()

第一个是从查询中提取 fromYear、fromMonth、toYear、toMonth。接下来是将其设置到查询中的相应位置。 有 4 个范围可供匹配:

MinYear = $year = MaxYear ==========> MinMonth < $month < MaxMonth
MinYear = $year < MaxYear ==========> MinMonth <= $month
MinYear < $year = MaxYear ==========> $month <= MaxMonth
MinYear < $year < MaxYear ==========> any $month

结果如下所示:

[
    {
        "id" : "BI_0010",
        "month" : 5,
        "year" : 2017
    },
    {
        "id" : "BI_0008",
        "month" : 3,
        "year" : 2018
    },
    {
        "id" : "BI_0001",
        "month" : 8,
        "year" : 2018
    }
]

关于mongodb - 如何在 Mongodb 中按月份和年份范围进行过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51609373/

相关文章:

java - Spring Data Mongo : How to save only date i. e。不是时间

mongodb - Spring数据MongoDb : MappingMongoConverter remove _class

mongodb - 覆盖 Labix mgo 中的默认 writeConcern

django - Mongoengine FileField 保存到磁盘?

mongodb - 如何使用 go mongo-driver 在 MongoDB 中将 []byte 存储为二进制文件

javascript - mongodb:如何为每个数组元素创建_id?

javascript - 使用 $regex 查询 Mongoose 不返回任何结果

mongodb - 带有 MongoDB 的重复事件模式

spring - 为什么 Spring ReactiveMongoRepository 没有 Mono 的保存方法?

mongodb - 我需要将数组元素插入 mongoDb 文档中的内部元素