2017-10-06 96 views
0

我對mongodb比較陌生。我們有一個集合中有startDate和endDate的文檔。什麼是最好的方式來查詢只有那些startDate和endDate文件在另一個日期範圍。mongodb日期範圍查詢獲取具有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年7月1日和2017年7月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

您的解決方案已關閉。

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

爲什麼它不能正常使用JS日期對象:) – user22197