Javascript 从MongoDB中的一系列日期中查找缺少的日期
我有一个Javascript 从MongoDB中的一系列日期中查找缺少的日期,javascript,mongodb,mongodb-query,aggregation-framework,Javascript,Mongodb,Mongodb Query,Aggregation Framework,我有一个集合,其中包含一个特定操作的serviceDate字段。 我需要查找给定日期范围是否缺少任何serviceDate,如果找到,则在MongoDB中的日期范围之间缺少serviceDate日期的返回列表。 我收集的JSON示例如下所示 { "_id" : ObjectId("5cefdb46bfbe1c0001f38413"), "category" : "RENT", "serviceDate" : ISODate("2019-06-15T05:30:00.000
集合
,其中包含一个特定操作的serviceDate
字段。
我需要查找给定日期范围是否缺少任何serviceDate
,如果找到,则在MongoDB中的日期范围之间缺少serviceDate日期的返回列表。
我收集的JSON示例如下所示
{
"_id" : ObjectId("5cefdb46bfbe1c0001f38413"),
"category" : "RENT",
"serviceDate" : ISODate("2019-06-15T05:30:00.000+05:30")
},
{
"_id" : ObjectId("5cefdb46bfbe1c0001f38412"),
"category" : "RENT",
"serviceDate" : ISODate("2019-06-14T05:30:00.000+05:30")
},
{
"_id" : ObjectId("5cefdb46bfbe1c0001f38411"),
"category" : "RENT",
"serviceDate" : ISODate("2019-06-13T05:30:00.000+05:30")
}
示例:
案例1:
如果托收有10份文件,且托收日期为2019年6月1日至2019年6月10日。
在我的查询中,我将2019年6月4日传递到2019年6月7日,结果应为空。
案例2:
如果一个集合有9个文档,并且从2019年6月1日开始至2019年6月10日结束,但2019年6月6日缺失。
在我的查询中,我通过了2019年6月4日至2019年6月7日,结果应该是2019年6月6日。
案例3:
如果一个集合有9个文档,并且从2019年6月1日开始至2019年6月10日结束,但2019年6月6日结束,则2019年6月5日缺失。
在我的查询中,我将从2019年6月4日传递到2019年6月7日,结果应该是2019年6月6日和2019年6月5日。您需要首先找到查询中传递的日期范围之间的所有日期。这需要一些javascript技巧
function getDates(startDate, stopDate) {
var dateArray = []
var currentDate = moment(startDate)
var stopDate = moment(stopDate)
while (currentDate <= stopDate) {
dateArray.push(moment(currentDate).format('YYYY-MM-DD'))
currentDate = moment(currentDate).add(1, 'days')
}
return dateArray
}
const dateArray = getDates(startDate, startDate)
//Output will be something like
dateArray = [ "2018-09-01", "2018-09-02", "2018-09-03", "2018-09-04", "2018-09-05" ]
日期范围是指只指定具有固定时间部分的日期05:30:00.000+05:30
?@mickl您可以忽略时间戳部分。
db.collection.aggregate([
{ '$match': {
'serviceDate': { '$gte': startDate, '$lte': endDate }
}},
{ '$group': {
'_id': null,
'dates': { '$push': { '$dateToString': { 'date': '$serviceDate', 'format': '%Y-%m-%d' }}}
}},
{ '$project': {
'missingDates': { '$setDifference': [dateArray, '$dates'] }
}}
])