Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mongodb日期范围查询以获取具有startDate&;的记录;实际结束_Mongodb_Aggregation Framework - Fatal编程技术网

mongodb日期范围查询以获取具有startDate&;的记录;实际结束

mongodb日期范围查询以获取具有startDate&;的记录;实际结束,mongodb,aggregation-framework,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"

我对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" : [ ] }]
我已经完成了查询的聚合和投影部分。而且它似乎工作正常。 唯一的问题是我应该在过滤器中使用什么条件。以下是我试图使用但未给出预期结果的查询的筛选部分:

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

你的解决方案很接近

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