【问题标题】:mongodb date range query optimizationmongodb日期范围查询优化
【发布时间】:2014-09-29 18:46:08
【问题描述】:

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

首先我尝试了一个简单的 $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 上使用索引(无论如何都有意义?)?

【问题讨论】:

    标签: mongodb query-optimization


    【解决方案1】:

    您搜索从end 之前的任何位置开始并在start 之后的任何位置结束的项目(这类似于您使用nor 表达它的方式,只是稍微简单一些):

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-09
      • 2018-09-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多