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'] }
  }}
])