跳转到主要内容

PyMongo的可解释CRUD API

项目描述

信息:

解释PyMongo中的集合。有关最新源代码,请参阅GitHub

作者:

Julius Park

关于

此包提供了一个ExplainableCollection类,允许解释PyMongo的集合方法

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')]))

在PyMongoExplain之后

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

安装

要安装此包,请使用pip

pip install pymongoexplain

支持/反馈

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

错误/功能请求

发现了一个bug吗?想在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

教程

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

要对命令运行解释,首先从原始用于运行命令的Collection对象实例化一个ExplainableCollection

from pymongoexplain import ExplainableCollection

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

如果您想配置解释命令本身的可选参数,像这样将它们传递给ExplainableCollection构造函数

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

有关更多信息,请参阅explain命令的文档。

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

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

现在result将包含运行给定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>

这将记录指定脚本中每个命令的解释输出,同时运行脚本中的每个命令。请注意,由于解释输出是使用logging模块生成的,如果您的脚本配置了logging模块,有一些事情需要注意

  • 如果您的脚本将logging level设置为高于INFO,则解释输出将被完全抑制。

  • 解释输出将被发送到您的脚本配置logging模块输出到的任何流。

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

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

局限性

此包不支持流畅的Cursor API,因此如果您尝试像这样使用它

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

相反,将所有参数传递给find()调用,如下所示

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

项目详情


下载文件

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

源分发

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

上传时间

构建分发

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

上传时间 Python 3