Pymongo 有一些Cursor 类的生活质量助手,所以它会自动为你做批处理,并将结果以文档的形式返回给你。
设置了batch_size 设置,但想法是您只需要在find() 方法中设置它,而不必进行手动低级调用或迭代批次。
例如,如果我的收藏中有 100 个文档:
> db.test.count()
100
然后我将profiling level 设置为记录所有查询:
> db.setProfilingLevel(0,-1)
{
"was": 0,
"slowms": 100,
"sampleRate": 1,
"ok": 1,
...
然后我使用 pymongo 指定batch_size of 10:
import pymongo
import bson
conn = pymongo.MongoClient()
cur = conn.test.test.find({}, {'txt':0}, batch_size=10)
print(list(cur))
运行该查询,我在 MongoDB 日志中看到:
2019-02-22T15:03:54.522+1100 I COMMAND [conn702] command test.test command: find { find: "test", filter: {} ....
2019-02-22T15:03:54.523+1100 I COMMAND [conn702] command test.test command: getMore { getMore: 266777378048, collection: "test", batchSize: 10, ....
(getMore repeated 9 more times)
所以查询是以指定的批次从服务器获取的。它只是通过 Cursor 类对您隐藏。
编辑
如果你真的需要批量获取文档,Collection下有个函数find_raw_batches()(doc link)。此方法的工作原理与find() 类似,并接受相同的参数。但是请注意,它将返回原始 BSON,应用程序需要在单独的步骤中对其进行解码。值得注意的是,此方法不支持sessions。
话虽如此,如果目标是降低应用程序的内存使用量,那么值得考虑修改查询以使其使用范围。例如:
find({'$gte': <some criteria>, '$lte': <some other criteria>})
范围查询更容易优化,可以使用索引,并且(在我看来)更容易调试并且在查询中断时更容易重新启动。这在使用批处理时不太灵活,您必须从头开始重新启动查询,并在它被中断时再次检查所有批处理。