mongodb - 如何配置mongodb索引以在时间范围内按值排序?
问题描述
我有一个像下面这样的集合
tx_collection
- value
- from
- to
- timestamp
我想从集合中提取的是特定时间段内的最高 100 个值。
例如,
db.getCollection('tx_collection').find({"timestamp":{$gte:ISODate("2018-01-10T00:00:00.000Z")}}).sort({"value":-1}).limit(100)
为了查询性能,我创建了类似的索引
{value: -1, timestmap: 1}
但是,当我使用索引运行查找查询时,花费了太多时间,超过 10 秒。
测试查询之一是这样的
db.getCollection('tx_collection').find({"timestamp": {$gte: ISODate("2019-10-16T22:09:12.000Z")}}).sort({"value":-1}).limit(100)
因此,当我再次尝试使用时executionStats
,nReturned
inputStageIXSCAN
的值 > 100。我期望nReturned
的是 100。
我的问题是,我的索引设置是否错误?如果它是错误的,什么是正确的索引?
(这个链接是我之前问的。当前案例与链接案例有点不同)
解决方案
这是自我解决。
在阅读并完全理解此文档后,我终于解决了。
连续查询是这样的:
db.getCollection('tx_collection').find({"value": {$gte: 0}, "timestamp": {$gte: ISODate("2019-10-16T22:09:12.000Z")}}).sort({"value":-1}).limit(100)
带索引{value: -1, timestmap: 1}
添加额外{"value": {$gte: 0}
的查询前缀,,索引可以使用。
推荐阅读
- c# - 显示目录 Asp .Net Core 中可用的文件
- search - 使用 Nativescript 搜索数据
- r - 处理 Quantstat 示例会产生错误
- scala - 从 String 创建 typeTag 并将其传递给多态方法
- mysql - 配置 debezium 连接器以读取没有任何部分数据的 mysql 二进制日志
- c - 2.4inch 8bit bus LCD ili9341 不支持STM32F103
- asp.net - 从 VS2019 将 Asp.Net Core 项目发布到 Web 托管网站 - 不知道如何继续
- spring-boot - 将github信息注入Spring bean
- stm32 - STM32H7 上的 SPI 通信位移一位
- sass - 循环数组sass并创建css