我对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")
]}]}}}
答案 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') ] }
]
}
}
}
}
}])