首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Mongodb正则表达式查询

Mongodb正则表达式查询
EN

Stack Overflow用户
提问于 2011-08-29 16:51:35
回答 3查看 11.3K关注 0票数 2

我使用Mongodb来存储世界各地的位置列表,有超过200万条记录。每条记录都是一个对象,如下所示:

代码语言:javascript
运行
复制
{ "_id" : ObjectId("4e5b339feee76320ab26f930"), "city" : "New York", "longitude" : -87.2008333, "latitude" : 30.8383333, "country_code" : "US", "country_name" : "United States" }

我想执行搜索来找出所有包含“纽约”的“城市”,我花了大约10秒钟才得到结果(这在我的网络系统中是不可接受的)。我已经使用ensureIndex()函数为"city“建立了索引,但是查询仍然很慢。

下面是我的问题:

代码语言:javascript
运行
复制
db.locations.find({"city": { "$regex": "(New York)", "$options": 'i' }})

我猜问题出在“正则表达式”上。你能给我一个解决方案,让我在2-3秒内得到查询结果(我在MySQL中有超过4M条记录,类似的查询只用了1-2秒-带索引)。

谢谢并致以问候。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-08-29 17:29:51

如果不使用regexp或javascript,你不能在mongodb中使用contain操作进行搜索(它们很慢,因为没有索引)。

我可以建议以小写存储额外的城市,并按完全匹配进行搜索。如果你想要“包含”和更快的速度,你应该使用其他一些全文搜索引擎,如solrlucene

票数 8
EN

Stack Overflow用户

发布于 2011-08-29 19:40:40

我建议使用多个键。

示例:

代码语言:javascript
运行
复制
{ title : "this is fun" ,
  _keywords : [ "this" , "is" , "fun" ]
}

然后你就可以使用

代码语言:javascript
运行
复制
 db.articles.findOne( { _keywords: "this" } )

这样会更快

票数 3
EN

Stack Overflow用户

发布于 2011-08-29 21:07:37

Mongo在不区分大小写的情况下进行搜索时,不会将索引用于regexp。我建议你用大写或小写存储你的字段,并使用相同的搜索。

如果你搜索,不是搜索,而是像下面这样开始

代码语言:javascript
运行
复制
db.locations.find({"city": { "$regex": /^New York/}}) 

您的查询将快速返回。

有关更多信息,请访问RegularExpressions

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

https://stackoverflow.com/questions/7228018

复制
相关文章

相似问题

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