gpt4 book ai didi

mongodb日期范围查询优化

转载 作者:可可西里 更新时间:2023-11-01 09:13:08 24 4
gpt4 key购买 nike

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

enter image description here

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

最佳答案

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

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

关于mongodb日期范围查询优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25167051/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com