mongodb日期范围查询优化

mongodb日期范围查询优化,mongodb,query-optimization,Mongodb,Query Optimization,我需要找到日期范围内或重叠的项目 首先,我尝试了一个简单的$nor查询 db.collection.find({ $nor: [{ "start.date": { $lt: start }, "end.date": { $lt: start } }, { "start.date": { $gte: end }, "end.date": { $gte: end } }] }); 并在两个日期字段上设置索引

我需要找到日期范围内或重叠的项目

首先,我尝试了一个简单的$nor查询

db.collection.find({
    $nor: [{
        "start.date": { $lt: start },
        "end.date": { $lt: start }
    }, {
        "start.date": { $gte: end },
        "end.date": { $gte: end }
    }]
});
并在两个日期字段上设置索引

db.collection.ensureIndex({“start.date”:1,“end.date”:1})

但它不会在查询中使用索引

"cursor": "BasicCursor",
"isMultiKey": false,
"n": 2,
"nscannedObjects": 100000,
"nscanned": 100000,
"nscannedObjectsAllPlans": 100000,
"nscannedAllPlans": 100000,
"scanAndOrder": false,
"indexOnly": false,
"nYields": 781,
"nChunkSkips": 0,
"millis": 151,
"allPlans": [
  {
    "cursor": "BasicCursor",
    "isMultiKey": false,
    "n": 2,
    "nscannedObjects": 100000,
    "nscanned": 100000,
    "scanAndOrder": false,
    "indexOnly": false,
    "nChunkSkips": 0
  }
],
"type": "COLLSCAN",
我尝试过的另一种方法是将$or与相同的索引一起使用

db.collection.find({
    $or: [{
        "start.date": start,
        "end.date": end
    }, {
        "start.date": { $lt: start },
        "end.date": { $lt: end, $gt: start },
    }, {
        "start.date": { $gt: start, $lt: end },
        "end.date": { $gt: end }
    }, {
        "start.date": { $gt: start },
        "end.date": { $lt: end }
    }, {
        "start.date": { $lt: start },
        "end.date": { $gt: end }
    }]
});
它将在查询时使用索引,但$nor甚至更快


有没有一种方法可以优化查询,或者可以在$nor上使用索引(无论如何都有意义?)

您可以搜索从
结束
之前的任意位置开始,在
开始
之后的任意位置结束的项目(这与使用
表示类似,只是稍微简单一点):

db.collection.find({
    "start.date": { $lt: end },
    "end.date": { $gt: start }
});