45
for post in db.datasets.find({"test_set":"abc"}).sort("abc",pymongo.DESCENDING).skip((page-1)*num).limit(num):

这是我当前的代码。

我如何获得 count() ?

4

6 回答 6

47

如果您使用的是 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()设置applySkipLimitTrue

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:
于 2010-12-11T06:48:45.153 回答
31

由于 pymongo 版本 3.7.0 及更高版本count() 已弃用。而是使用Collection.count_documents. 运行cursor.countorcollection.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. 此方法将根据集合元数据返回估计的文档数量(如名称所示)。

于 2019-02-19T05:23:46.950 回答
9

如果您已经通过限制“num”,则不确定为什么要计数。无论如何,如果你想断言,这就是你应该做的。

results = db.datasets.find({"test_set":"abc"}).sort("abc",pymongo.DESCENDING).skip((page-1)*num).limit(num)

results_count = results.count(True)

这将使results_countnum匹配

于 2012-09-27T12:16:50.310 回答
2

无法对@Sohaib Farooqi 的回答发表评论……快速说明:虽然已被弃用,但在计算集合中的所有文档时(即 filter={})cursor.count(),它比collection.count_documents()我的所有测试都要快得多。运行显示使用聚合管道,而没有。这可能是一个原因。db.currentOp()collection.count_documents()cursor.count()

于 2021-04-28T10:19:36.487 回答
1

这个线程恰好是 11 岁。但是,在 2022 年,“count()”函数已被弃用。这是我想出的一种使用 Python 对 MongoDB 中的文档进行计数的方法。这是代码片段的图片。不需要制作一个空列表,我只是想变得古怪。希望这可以帮助 :)。代码片段在这里。

于 2022-02-12T16:31:37.050 回答
0

在我的情况下,事情依赖于给定查询的匹配元素的计数,并且肯定不会重复此查询两次:

一个获取计数,
两个获取结果集。

没门

我知道查询结果集不是很大并且适合内存,因此,我可以将其转换为列表,并获取列表长度。

此代码说明了用例:

# 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
于 2020-06-11T14:38:54.273 回答