Mongodb通过正则表达式查询

时间:2011-08-29 08:51:35

标签: mongodb indexing pymongo

我使用Mongodb来存储全世界的位置列表,记录超过2M。每条记录都是这样的对象:

{ "_id" : ObjectId("4e5b339feee76320ab26f930"), "city" : "New York", "longitude" : -87.2008333, "latitude" : 30.8383333, "country_code" : "US", "country_name" : "United States" }

我想执行搜索以使所有“CITIES”包含“纽约”,我花了大约10秒才得到结果(这在我的网络系统中是不可接受的)。我使用ensureIndex()函数索引了“city”,但查询仍然很慢。

这是我的问题:

db.locations.find({"city": { "$regex": "(New York)", "$options": 'i' }})

我猜问题是“正则表达式”。你可以建议我一个解决方案,以便在2-3秒内获得查询结果(我在MySQL中有超过4M的记录,类似的查询只用了1-2秒 - 带索引)。

谢谢和问候。

3 个答案:

答案 0 :(得分:8)

你不能在没有使用regexp或javascript的情况下使用mongodb中的包含操作进行搜索(由于没有索引的工作,它们很慢)。

我可以建议以小写字母存储其他城市,并按完全匹配搜索。如果您想要“包含”和快速,则应使用其他全文搜索引擎,例如solrlucene

答案 1 :(得分:3)

我建议使用多键。

示例:

{ title : "this is fun" ,
  _keywords : [ "this" , "is" , "fun" ]
}

然后你可以使用

 db.articles.findOne( { _keywords: "this" } )

这会更快

答案 2 :(得分:2)

mongo在使用不区分大小写的搜索时不使用regexp的索引,因此我建议您使用大写或小写存储字段并使用相同的搜索。

而不是搜索,如果您搜索以下面的内容开头

db.locations.find({“city”:{“$ regex”:/ ^ New York /}})

您的查询将快速返回。

了解更多信息
http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-RegularExpressions