Python pymongo,计数查询比mongo shell慢
各位。我在pymongo遇到麻烦了Python pymongo,计数查询比mongo shell慢,python,mongodb,pymongo,Python,Mongodb,Pymongo,各位。我在pymongo遇到麻烦了 pymongo 3.0.3 MongoDB 2.6.10(在本地主机上) 下面的查询在mongo shell上运行,我在3秒内得到了结果 $ mongo mydb > db.products.count({'categories': { '$elemMatch': {'code': /^11/}}}) 891115 但是,通过pymongo编写的python脚本,我花了30秒才得到结果 $ python Python 3.4.3 (default,
- pymongo 3.0.3
- MongoDB 2.6.10(在本地主机上)
$ mongo mydb
> db.products.count({'categories': { '$elemMatch': {'code': /^11/}}})
891115
但是,通过pymongo编写的python脚本,我花了30秒才得到结果
$ python
Python 3.4.3 (default, Jun 26 2015, 04:26:33)
>>> import pymongo
>>> import re
>>>
>>> cli = pymongo.MongoClient()
>>> coll = cli.mydb.products
>>>
>>> coll.count({'categories': { '$elemMatch': {'code': re.compile(r'^11')}}})
891115
(参考)
有谁能给我一些建议,为什么我用python脚本运行它时会变慢?只是搞错了查询。
在前缀搜索中,使用Python的're'模块,而不是pymongo的'$regex'
# wrong. MongoDB does not use index.
coll.count({'categories': { '$elemMatch': {'code': re.compile(r'^11')}}})
# correct. MongoDB use index.
coll.count({'categories': { '$elemMatch': {'code': { '$regex' : '^11' }}}})
谢谢 为什么使用不同版本的pymongo和mongod?我尝试了pymongo版本2.6.3、2.7.2和2.8.1,但没有改进
coll.find({'categories':{'elemMatch':{'code':re.compile(r'^11')}}}).count()
pymongo 3.0.3不支持MongoDB 2.6?我阅读了pymongo的变更日志,但没有发现MongoDB 2.6被弃用。我发现它给出了一个'code':'11'
,而不是'code]:重新编译(r'^11')
,在三秒内得到了结果。但这个问题还没有解决,已经解决了<代码>'code':{'$regex':'^11'}这很奇怪。您是否使用Python的re
运行了explain?因为MongoDB在以^
开头时使用regex索引,所以它是$regex
还是Pythonre
对象可能并没有区别。我检查并报告了它$regex version“是'nscannedObjects”:891115
,“re version”是'nscannedObjects':8034295
。两个查询都使用了“cursor”:“BtreeCursor categories.code_1”
,但indexBounds是不同的。”$regex version“是{”categories.code':[['11',12'],[regex('^11',0),regex('^11',0)]}
,“re version”是{”categories.code':[['''',{}],[regex('^11',32],regex('^11',32)]}
。
# wrong. MongoDB does not use index.
coll.count({'categories': { '$elemMatch': {'code': re.compile(r'^11')}}})
# correct. MongoDB use index.
coll.count({'categories': { '$elemMatch': {'code': { '$regex' : '^11' }}}})