for post in db.datasets.find({"test_set":"abc"}).sort("abc",pymongo.DESCENDING).skip((page-1)*num).limit(num):
这是我当前的代码。
我如何获得 count() ?
如果您使用的是 pymongo 3.7.0 或更高版本,请参阅此答案。
如果你想results_count
忽略你的limit()
:
results = db.datasets.find({"test_set":"abc"}).sort("abc",pymongo.DESCENDING).skip((page-1)*num).limit(num)
results_count = results.count()
for post in results:
如果您希望将results_count
设置为上限,limit()
请设置applySkipLimit
为True
:
results = db.datasets.find({"test_set":"abc"}).sort("abc",pymongo.DESCENDING).skip((page-1)*num).limit(num)
results_count = results.count(True)
for post in results:
由于 pymongo 版本 3.7.0 及更高版本count() 已弃用。而是使用Collection.count_documents
. 运行cursor.count
orcollection.count
将导致以下警告消息:
DeprecationWarning: count is deprecated. Use Collection.count_documents instead.
使用count_documents
代码可以调整如下
import pymongo
db = pymongo.MongoClient()
col = db[DATABASE][COLLECTION]
find = {"test_set":"abc"}
sort = [("abc",pymongo.DESCENDING)]
skip = 10
limit = 10
doc_count = col.count_documents(find, skip=skip)
results = col.find(find).sort(sort).skip(skip).limit(limit)
for doc in result:
//Process Document
注意: count_documents
与方法相比,方法的执行速度相对较慢count
。为了优化你可以使用collection.estimated_document_count
. 此方法将根据集合元数据返回估计的文档数量(如名称所示)。
如果您已经通过限制“num”,则不确定为什么要计数。无论如何,如果你想断言,这就是你应该做的。
results = db.datasets.find({"test_set":"abc"}).sort("abc",pymongo.DESCENDING).skip((page-1)*num).limit(num)
results_count = results.count(True)
这将使results_count与num匹配
无法对@Sohaib Farooqi 的回答发表评论……快速说明:虽然已被弃用,但在计算集合中的所有文档时(即 filter={})cursor.count()
,它比collection.count_documents()
我的所有测试都要快得多。运行显示使用聚合管道,而没有。这可能是一个原因。db.currentOp()
collection.count_documents()
cursor.count()
这个线程恰好是 11 岁。但是,在 2022 年,“count()”函数已被弃用。这是我想出的一种使用 Python 对 MongoDB 中的文档进行计数的方法。这是代码片段的图片。不需要制作一个空列表,我只是想变得古怪。希望这可以帮助 :)。代码片段在这里。
在我的情况下,事情依赖于给定查询的匹配元素的计数,并且肯定不会重复此查询两次:
一个获取计数,
两个获取结果集。
没门
我知道查询结果集不是很大并且适合内存,因此,我可以将其转换为列表,并获取列表长度。
此代码说明了用例:
# pymongo 3.9.0
while not is_over:
it = items.find({"some": "/value/"}).skip(offset).size(limit)
# List will load the cursor content into memory
it = list(it)
if len(it) < size:
is_over = True
offset += size