首页 > 解决方案 > Mongoose / MongoDB 按多个日期范围聚合过滤器

问题描述

我有一个包含 365 个文档的集合。每个文件如下:

{
  date: "2018-11-27T00:00:00.000Z",
  title: "Went to school"
},
{
  date: "2018-11-28T00:00:00.000Z",
  title: "Bought a car"
}

我想按多个数据范围过滤文档。例子:

  1. 仅显示2018-01-04之前和之后创建的文档2018-11-24
  2. 结果不应包含在间隔中创建的文档2018-05-06-2018-06-07等等

到目前为止,我得到了这个:

const dates = await Calendar.aggregate(
  [{
      $match: {
        $and: [{
            date: {
              $not: {
                $lte: new Date(2018, 0, 7),
              }

            }
          },
          {
            date: {
              $not: {
                $gte: new Date(2018, 10, 15)
              }
            }
          },
          {
            date: {
              $not: {
                $gt: new Date(2018, 6, 31),
                $lt: new Date(2018, 7, 15)
              }
            }
          }
        ]
      }
    },
    {
      $project: {
        title: 1,
        date: 1
      }
    }
  ]
).sort('date')

先感谢您!

标签: mongodbmongoosemongodb-queryaggregation-framework

解决方案


您需要在查询中使用$lte$gte与单个date对象

Calendar.aggregate([
  { "$match": {
    "$and": [
      { "date": { "$lte": new Date(2018, 0, 7), "$gte": new Date(2018, 10, 15) }},
      { "date": { "$not": { "$lte": new Date(2018, 0, 7), "$gte": new Date(2018, 10, 15) }}}
    ]
  }}
])

推荐阅读