【发布时间】: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