Skip to main content

PyMongo 的可解释的 CRUD API

项目描述

信息

解释 PyMongo 中的集合。请参阅 GitHub 获取最新源。

作者

朱利叶斯公园

关于

这个包提供了一个ExplainableCollection类,可以解释PyMongo 的 Collection 方法

PyMongoExplain 大大简化了解释命令所需的工作量。例如,假设我们想解释以下update_one

collection.update_one({"quantity": 1057, "category": "apparel"},{"$set": {"reorder": True}})

在 PyMongoExplain 之前,需要将 update_one 转换为等效的 MongoDB 命令:

collection.database.command(SON([('explain', SON([('update', 'products'), ('updates', [{'q': {'quantity': 1057, 'category': 'apparel'}, 'upsert': False, 'multi': False, 'u': {'$set': {'reorder': True}}}])])), ('verbosity', 'queryPlanner')]))

在 PyMongo 之后解释:

ExplainableCollection(collection).update_one({"quantity": 1057, "category": "apparel"},{"$set": {"reorder": True}})

安装

要安装这个包,只需使用 pip:

pip install pymongoexplain

支持/反馈

有关问题、讨论或一般技术支持,请访问MongoDB 社区论坛。MongoDB 社区论坛是与其他 MongoDB 用户联系、提问和获取答案的集中场所。

错误/功能请求

认为你发现了一个错误?想查看 PyMongoExplain 中的新功能吗?请在此GitHub 存储库上打开一个问题。

如何寻求帮助

打开问题时,请包括以下所有信息:

  • 如果可能,重现问题的详细步骤,包括完整的回溯。

  • 使用的确切 python 版本,带有补丁级别:

    $ python -c "import sys; print(sys.version)"
  • 使用的 PyMongo 的确切版本(如果适用),带有补丁级别:

    $ python -c "import pymongo; print(pymongo.version); print(pymongo.has_c())"
  • 使用的 PyMongoExplain 的确切版本:

    $ python -c "import pymongoexplain; print(pymongoexplain.version)"

依赖项

PyMongoExplain 需要 CPython 3.5+ 和 PyPy3.5+。

PyMongoExplain 需要PyMongo>=3.10,<4

测试

运行测试的最简单方法是在发行版的根目录中运行python setup.py test 。

教程

现有应用程序代码中的 PyMongo 操作可以通过将Collection对象与ExplainableCollection 对象交换来解释。ExplainableCollection类提供了 PyMongo 的 Collection 提供的所有 CRUD API 方法但是使用这个类来运行操作会在它们上运行解释,而不是执行它们。

要对命令运行解释,首先从最初用于运行命令的Collection对象中实例化一个ExplainableCollection :

from pymongoexplain import ExplainableCollection

collection = client.db.products
explain = ExplainableCollection(collection)

如果您希望为 explain 命令本身配置选项,请将它们传递给ExplainableCollection构造函数,如下所示:

explain = ExplainableCollection(collection, verbosity="queryPlanner",
                                comment="I'm a comment")

有关详细信息,请参阅说明命令的文档。

现在您可以解释一些命令了。请记住,解释命令不会执行它:

result = explain.update_one({"quantity": 1057, "category": "apparel"}, {"$set": {"reorder": True}})

现在结果将包含在给定update_one命令上运行解释的输出:

{'ok': 1.0,
 'operationTime': Timestamp(1595603051, 3),
 'queryPlanner': {'indexFilterSet': False,
                  'namespace': 'db.products',
                  'parsedQuery': {'$and': [{'category': {'$eq': 'apparel'}},
                                           {'quantity': {'$eq': 1057}}]},
                  'planCacheKey': 'CD8F6D8F',
                  'plannerVersion': 1,
                  'queryHash': 'CD8F6D8F',
                  'rejectedPlans': [],
                  'winningPlan': {'inputStage': {'direction': 'forward',
                                                 'filter': {'$and': [{'category': {'$eq': 'apparel'}},
                                                                     {'quantity': {'$eq': 1057}}]},
                                                 'stage': 'COLLSCAN'},
                                  'stage': 'UPDATE'}},
 'serverInfo': {'gitVersion': '27f5c1ee9f513f29fe30b8ebefed99581428c6e1',
                'host': 'Juliuss-MBP.verizon.net',
                'port': 27017,
                'version': '4.4.0-rc13'}}

由于ExplainableCollection实例提供了Collection实例提供的所有相同方法,因此在应用程序代码中解释操作很简单,只需将应用程序代码中的Collection实例替换为ExplainableCollection实例即可。

解释脚本中的命令

您还可以使用我们的 CLI 工具对 Python 脚本中的所有命令运行解释。给定一个包含pymongo命令的脚本,您可以简单地运行:

python3 -m pymongoexplain <path/to/your/script.py>

除了在脚本本身中运行每个命令外,这还将记录指定脚本中每个命令的解释输出。请注意,由于解释输出是使用日志记录模块生成的,因此如果您的脚本配置了日志记录模块,请记住以下几点:

  • 如果您的脚本将日志记录级别设置为高于 INFO,则解释输出将被完全抑制。

  • 解释输出将发送到您的脚本配置日志记录模块以将输出发送到的任何流。

脚本所需的任何位置参数或参数都可以简单地附加到调用中,如下所示:

python3 -m pymongoexplain <path/to/your/script.py> [PARAMS] [--optname OPTS]

限制

这个包不支持 fluent Cursor API,所以如果你尝试像这样使用它:

ExplainableCollection(collection).find({}).sort(...)

而是将所有参数传递给 find() 调用,如下所示:

ExplainableCollection(collection).find({}, sort=...)

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

pymongoexplain-1.2.0.tar.gz (17.4 kB 查看哈希)

已上传 source

内置分布

pymongoexplain-1.2.0-py3-none-any.whl (15.7 kB 查看哈希

已上传 py3