mongodb日期范围查询以获取具有startDate&;的记录;实际结束
我对mongodb比较陌生。我们在一个集合中有startDate和endDate的文档。仅查询startDate和endDate在另一个日期范围内的文档的最佳方式是什么 假设我们在报告数组中有以下子文档: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"
{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') ] }
]
}
}
}
}
}])