如何在 Mongodb 中按月份和年份范围过滤
How to filter by month and year range in 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 查询中使用 $lt 和 $gt 过滤器。例如,我用以下查询解决了问题:
db.getCollection('Bills').find({"month":{$gte:6, $lte:8},"year":{$gte:2017,$lte:2018}})
使用“gte”表示大于等于,使用“lte”表示小于等于。同样,'gt' 表示大于,'lt' 表示小于。
上面的代码对我来说很好用。
我的文档是这样的:
{
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 查询中使用 $lt 和 $gt 过滤器。例如,我用以下查询解决了问题:
db.getCollection('Bills').find({"month":{$gte:6, $lte:8},"year":{$gte:2017,$lte:2018}})
使用“gte”表示大于等于,使用“lte”表示小于等于。同样,'gt' 表示大于,'lt' 表示小于。 上面的代码对我来说很好用。