MongoDB索引数组问题

MongoDB索引数组问题,mongodb,Mongodb,我对mongoDB版本3.4.10索引数组有疑问,因为我发现它们不能正常工作。也许我做错了什么 我有一份日程安排文件,其中有些道具对这个问题并不重要。但每个计划在数组中都有它的计划发生周期 {…计划:[{开始日期:2018-01-04T00:00:00Z, endDateTime:2018-01-04T23:59:59Z},{startDateTime: 2018-01-11T00:00:00Z,endDateTime:2018-01-11T23:59:59Z}…] }, 现在,我需要按该数组项

我对mongoDB版本3.4.10索引数组有疑问,因为我发现它们不能正常工作。也许我做错了什么

我有一份日程安排文件,其中有些道具对这个问题并不重要。但每个计划在数组中都有它的计划发生周期

{…计划:[{开始日期:2018-01-04T00:00:00Z, endDateTime:2018-01-04T23:59:59Z},{startDateTime: 2018-01-11T00:00:00Z,endDateTime:2018-01-11T23:59:59Z}…] },

现在,我需要按该数组项搜索计划文档,并找到适合该时间段的所有计划。 我已经创建了索引计划.startDateTime和计划.endDateTime

当我使用compas option explain plan执行以下查询时,我得到了非常糟糕的结果

{Plans.StartDateTime:{$lt:新日期'2018-01-10'},Plans.EndDateTime:{$gte:新日期'2018-01-15'}

结果是,这是在测试环境中,文档数量非常少,在生产中的比率甚至更高

归还文件:2823 检查的索引键:65708 审查的文件:11554 当我深入分析时,我得到了以下含义,即mongo在索引搜索中忽略了计划结束日期:

indexBounds:{Plans.StartDateTime:[正确,新 Date1515542400000],Plans.EndDateTime:[[MinKey, MaxKey]]}


有人能告诉我如何为下面的搜索创建更好的索引,因为这个索引不起作用吗?

为了找到至少有一个计划与给定时间间隔重叠的所有计划文档,例如2018-01-10和2018-01-14,您必须使用MongoDB操作符

db.scheduleDocuments.find({
    plans: {
        $elemMatch: {
            startDateTime: { $lte: ISODate("2018-01-14Z") },
            endDateTime: { $gt: ISODate("2018-01-10Z") }
        }
    }
});
可以找到用于测试重叠间隔的规则

除非在数组上创建索引,否则此搜索将执行集合扫描

db.scheduleDocuments.createIndex({
    "plans.startDateTime": 1,
    "plans.endDateTime": 1
});
由于索引,集合中不匹配的文档根本不会被扫描。执行IXSCAN,只访问匹配的文档以获取和返回