mongodb日期范围查询以获取具有startDate& amp;结束日期

时间:2017-10-06 16:58:31

标签: mongodb aggregation-framework

我对mongodb比较新。我们有一个在集合中有startDate和endDate的文档。什么是查询startDate和endDate属于另一个日期范围的文档的最佳方法。

假设我们在报告数组中有以下子文档:

{reports: [
 {
  "startDate" : ISODate("2017-07-02T00:00:00Z"),
  "endDate" : ISODate("2017-07-08T00:00:00Z"),
  "data" : [ ] 
 },
 {
  "startDate" : ISODate("2017-07-09T00:00:00Z"),
  "endDate" : ISODate("2017-07-15T00:00:00Z"),
  "data" : [ ] },
 {
  "startDate" : ISODate("2017-07-16T00:00:00Z"),
  "endDate" : ISODate("2017-07-22T00:00:00Z"),
  "data" : [ ] }
]}    

现在我想在2017-07-01和2017-07-16之间仅查询报告数组中的子文档。 结果中的预期子文件应为:

[{
 "startDate" : ISODate("2017-07-02T00:00:00Z"),
 "endDate" : ISODate("2017-07-08T00:00:00Z"),
 "data" : [ ] 
},
{
 "startDate" : ISODate("2017-07-09T00:00:00Z"),
 "endDate" : ISODate("2017-07-15T00:00:00Z"),
 "data" : [ ] }]

我已经完成了查询的聚合和投影部分。它似乎工作正确。 唯一的问题是我应该在过滤器中使用什么条件。这是Iam尝试使用的查询的过滤器部分,但没有给出我预期的结果:

{$filter: {
  input: "$reports", as: "reports", 
  cond: {$and: 
   [{ $gte: ["$$reports.startDate", new Date("2017-07-02") ]}, 
    { $lte: ["$$reports.endDate", new Date("2017-07-08") 
]}]}}}

1 个答案:

答案 0 :(得分:1)

你的解决方案很接近。

db.DailyReports.aggregate([{
  $project: {
    reports: {
      $filter: {
        input: '$reports',
        as: 'report',
        cond: {
          $and: [
           { $gte: [ '$$report.startDate', new ISODate('2017-07-02') ] },
           { $lte: [ '$$report.endDate', new ISODate('2017-07-08') ] }
          ]
        }
      }
    }
  }
}])