python - 在 MongoDB find() 中返回完整结果

标签 python mongodb

我一直在致力于一个项目来评估 mongodb 与其他数据存储相比的速度。为此,我尝试对我制作的集合执行完整扫描。我发现了探查器,所以我启用了它并设置为记录每个查询。我有一个包含一百万个对象的集合,我正在尝试计算扫描该集合所需的时间。不幸的是,当我运行时

db.sampledata.find()

它会立即将光标返回到 1000 个左右的对象。所以我编写了一个 python 脚本来迭代光标来处理所有结果。这是:

from pymongo import MongoClient

client = MongoClient()

db = client.argocompdb
data = db.sampledata

count = 0
my_info = data.find()

for row in my_info:
    count += 1

print count

这似乎需要必要的时间。然而,当我检查探查器时,没有完整查询时间的总量,它只是一整套“getmore”操作,每个操作需要 3-6 毫秒。有什么办法可以使用探查器来完成我想要做的事情,而不是在 python 中计时?我本质上只是想:

  1. 能够执行查询并让它返回所有结果 仅光标中的少数几个。
  2. 为分析器中的“完整查询”争取时间。获得所有结果所需的时间。

我想做的事情可行吗?

我对 MongoDB 很陌生,所以如果之前有人问过这个问题,但我找不到任何内容,我感到非常抱歉。

最佳答案

分析器正在测量正确的东西。 Mongo 驱动程序不会立即返回集合中的所有记录;它首先为您提供一个光标,然后在您遍历光标时逐一输入文档。因此分析器正在准确测量正在执行的操作。

我认为这是一个比您正在寻求的指标更正确的指标,我认为这是实际将所有文档读入客户端所需的时间。您实际上不希望 Mongo 驱动程序在返回之前将所有文档读入内存。如果以这种方式编写,任何应用程序都不会表现良好,除了最小的集合之外。客户端按需读取文档的速度要快得多,因此需要最小的总内存占用。

此外,您将其与什么进行比较?如果您要与关系数据库进行比较,那么关系数据库中的模式以及 Mongo 中的集合和文档的外观非常重要。当然,还有每个索引是如何建立的。不同的选择可能会产生截然不同的性能结果,这并不是数据库引擎的错误。

Mongo 中最简单、因此最快的操作可能是通过 id 检索小文档,该文档始终被索引:db.collection.find({id: .. .})。但如果您确实想测量线性扫描,那么文档越小,扫描速度就越快。但实际上,这并不是很有用,因为它基本上只测量服务器从磁盘读取数据的速度。

关于python - 在 MongoDB find() 中返回完整结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26985138/

相关文章:

Python 切片按相反顺序赋值不起作用!为什么?

node.js - 无法在重置密码中保存 Bcrypt 密码

javascript - nodeJS 模块 Mongoose 给我错误

mongodb - Riak 是否推荐用于存储和流式传输大型二进制文件?

python - 根据前缀将列加载到多个 DataFrame 中

python - conda 环境在 conda env 列表中没有可见的名称 - 如何在 shell 中激活它?

python - 如何将 pickle 数据上传到 django FileField?

java - 如何仅从 Mongodb 文档中获取特定字段?

javascript - Mongoose ,检查对象数组中是否存在值

python - 在 vscode/jupyter 中调试外部模块代码