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

时间:2014-11-18 01:34:23

标签: 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. 在探查器中抽出时间进行“完整查询”。获得所有结果所花费的时间。
  3. 我想做的是可行的吗?

    我是MongoDB的新手,所以如果之前有人问过我很抱歉,但我找不到任何内容。

1 个答案:

答案 0 :(得分:2)

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

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

另外,你在比较什么?如果您要与关系数据库进行比较,那么您的架构在关系数据库中的重要性以及Mongo中的集合和文档是什么样的。当然,每个都是如何编入索引的。在数据库引擎没有错误的情况下,不同的选择可以产生非常不同的性能结果。

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