python - pymongo,计数查询比 mongo shell 慢

标签 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, 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

(引用)

$ mongo mydb
> db.products.getIndexes()
[
        {
                "v" : 1,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_",
                "ns" : "mydb.products"
        },
        {
                "v" : 1,
                "key" : {
                        "brand" : 1
                },
                "name" : "brand_1",
                "ns" : "mydb.products"
        },
        {
                "v" : 1,
                "key" : {
                        "categories.code" : 1
                },
                "name" : "categories.code_1",
                "ns" : "mydb.products"
        },
        {
                "v" : 1,
                "key" : {
                        "categories.code" : 1,
                        "brand" : 1
                },
                "name" : "categories.code_1_brand_1",
                "ns" : "mydb.products"
        }
]

> db.products.find({categories: {$elemMatch: {code: /^11/}}}).explain()
{
        "cursor" : "BtreeCursor categories.code_1",
        "isMultiKey" : true,
        "n" : 891115,
        "nscannedObjects" : 891115,
        "nscanned" : 891116,
        "nscannedObjectsAllPlans" : 891216,
        "nscannedAllPlans" : 891217,
        "scanAndOrder" : false,
        "indexOnly" : false,
        "nYields" : 6962,
        "nChunkSkips" : 0,
        "millis" : 2764,
        "indexBounds" : {
                "categories.code" : [
                        [
                                "11",
                                "12"
                        ],
                        [
                                /^11/,
                                /^11/
                        ]
                ]
        },
        "server" : "ip-10-4-0-124:27017",
        "filterSet" : false
}

谁能给我一些建议,为什么当我用 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' }}}})

谢谢!

关于python - pymongo,计数查询比 mongo shell 慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31286651/

相关文章:

javascript - 是否可以在 Mongodb 上模拟大数据流?

mongodb - 在Mongodb聚合中获取分页结果

database - 查找其中一个字段的值不为空且不存在于不同字段中的 MongoDB 文档

python - 如何使用 NetworkX 和 pymongo 绘制 Twitter 用户的社交网络?

python - 如何改进 XML 导入到 mongodb 中?

使用 Paramiko 从远程主机获取文件的 Python 代码

python - 循环 - 如果多个条件之一为 True 则追加到新列表

ruby-on-rails - Mongoid:对 MongoDB 的评论和用户对 MySQL 的评论?如何让它发挥作用

python - 仅调整 matplotlib 中两个子图之间的距离

python - 如何确定嵌套列表结构是否与另一个相同,但元素交换为新的