在MongoDB的pymongo中,我如何进行count()?

时间:2010-12-11 06:24:22

标签: mongodb count pymongo database

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

这是我目前的代码。

我如何得到计数()?

5 个答案:

答案 0 :(得分:26)

如果你正在使用pymongo版本3.7.0或更高版本,而不是see this answer


如果您希望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()set applySkipLimit to 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:

答案 1 :(得分:8)

如果您已经通过限制'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

匹配

答案 2 :(得分:5)

自pymongo 3.7.0及更高版本count() is deprecated起。而是使用Collection.count_documents。运行cursor.countcollection.count将导致以下警告消息:

DeprecationWarning: count is deprecated. Use Collection.count_documents instead.

要使用count_documents,可以按以下方式调整代码

import pymongo

db = pymongo.MongoClient()
col = db[DATABASE][COLLECTION]

filter = {"test_set":"abc"}
sort = [("abc",pymongo.DESCENDING)]
skip = 10
limit = 10

doc_count = col.count_documents(filter, skip=skip)
results = col.find(filter).sort(sort).skip(skip).limit(limit)

for doc in result:
   //Process Document

注意:与count_documents方法相比,count方法的执行速度相对较慢。为了优化,您可以使用collection.estimated_document_count。此方法将根据集合元数据返回估计的文档数量(如名称所示)。

答案 3 :(得分:0)

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

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

不可能

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

此代码说明了用例:

if (!Regex.IsMatch(enteredOperation, "^(?=.*\\+).{1}$ || ^(?=.*\\-).{1}$ || ^(?=.*\\*).{1}$ || ^(?=.*\\/).{1}$")) 
{
    Console.WriteLine("Please restart the program and enter one of the symbols + - * / for the operation you want to complete");
    break;
}

答案 4 :(得分:0)

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