Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python pymongo,计数查询比mongo shell慢_Python_Mongodb_Pymongo - Fatal编程技术网

Python pymongo,计数查询比mongo shell慢

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遇到麻烦了

  • 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, 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
还是Python
re
对象可能并没有区别。我检查并报告了它$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' }}}})