首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >部分文本搜索时MongoDB速度查询

部分文本搜索时MongoDB速度查询
EN

Stack Overflow用户
提问于 2020-12-02 03:09:07
回答 1查看 35关注 0票数 0

我有一个很小的数据库,有200万条电话记录。

当我执行:

代码语言:javascript
运行
复制
db.getCollection('calls').find({  
    'IsIncoming':true, 'DateCreated' : { '$gte':ISODate('2010-12-02T02:26:22.478Z') }, 'CallerIdNum':"2545874578"
}).limit(100).count({})

这是晚餐快,它需要95 is。注意,IsIncoming**,** DateCreted CallerIdNum 都有索引。每次我使用这些字段进行搜索时,都是超快的

当我搜索包含部分文字的东西的时候,它是非常缓慢的。例如,这个查询现在需要25秒:

代码语言:javascript
运行
复制
db.getCollection('calls').find({  
    'IsIncoming':true, 'DateCreated' : { '$gte': ISODate('2010-12-02T02:26:22.478Z') }, 'CallerIdNum' : /2545874/
}).limit(100).count({})

我知道原因是因为我在CallerIdNum中搜索。如果我在哪里预先知道完整的来电者身份,就像在我的第一个查询中一样,那么它就会很快。

问题

我希望最后一个查询执行得更快。我知道这可能是不可能的,获得良好性能的唯一方法就是通过整个CallerIdNum进行搜索。但是也许/希望我错了,有人可以帮我找到更快地执行最后一个查询的方法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-02 03:12:43

这里的问题是,您正在搜索调用者ID号/2545874/的子字符串。这是不可行的,而且一般不能使用索引。假设您真的想要以该前缀开头的数字,那么使用这个可使用的版本:

代码语言:javascript
运行
复制
db.getCollection('calls').find({  
    'IsIncoming':true, 'DateCreated' : { '$gte': ISODate('2010-12-02T02:26:22.478Z') }, 'CallerIdNum' : /^2545874/
}).limit(100).count({})

您还可能希望在所有三个字段上添加一个复合索引,尽管至少我上面提供的查询版本可以使用涉及CallerIdNum字段的索引。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65101650

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档