我的文档如下:
{
id: "abc",
value: 1234,
month: 6,
year: 2018
}
如何在聚合中像下面这样过滤查询:
{
from: "6/2017",
to: "8/2018"
}
答案 0 :(得分:1)
我一个人得到的:
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。接下来是将其设置为查询中的相应位置。 有四个范围要匹配:
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
}
]
答案 1 :(得分:0)
在这个问题上,我建议您在mongodb查询中使用$ lt和$ gt过滤器。例如,我通过以下查询解决了该问题:
db.getCollection('Bills').find({"month":{$gte:6, $lte:8},"year":{$gte:2017,$lte:2018}})
使用' gte '大于等于,使用' lte '小于等于。同样,“ gt ”表示大于,而“ lt ”表示小于。 上面的代码对我来说很好。