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

bq8i3lrv  于 2023-01-01  发布在  Go
关注(0)|答案(7)|浏览(528)
for post in db.datasets.find({"test_set":"abc"}).sort("abc",pymongo.DESCENDING).skip((page-1)*num).limit(num):

如何获得count()

e7arh2l6

e7arh2l61#

如果你使用的是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_countlimit()处封顶,请将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:
qhhrdooz

qhhrdooz2#

由于pymongo 3.7.0及以上版本不推荐使用count(),请改用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]

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。此方法将根据集合元数据返回文档的估计数量(顾名思义)。

3ks5zfa0

3ks5zfa03#

如果你已经传递了极限'num',不确定为什么你要计数。无论如何,如果你想Assert,下面是你应该做的。

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

results_count = results.count(True)

这将使results_countnum匹配

vof42yt1

vof42yt14#

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

4nkexdtk

4nkexdtk5#

这个线程已经有11年的历史了。然而,在2022年,'count()'函数已经被弃用了。下面是我用Python在MongoDB中计算文档数量的方法。这是一个代码片段的图片。不需要创建一个空列表,我只是想做得古怪一些。希望这能有所帮助:). Code snippet here.

qybjjes1

qybjjes16#

在我的例子中,这取决于给定查询的匹配元素的计数,并且肯定不会重复这个查询两次:

以获得计数,以及
两个以获取结果集。

  • 不可能 *

我知道查询结果集不是很大,内存容量有限,因此,我可以将其转换为列表,并获得列表长度。
此代码说明了用例:

# 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
kse8i1jr

kse8i1jr7#

如果你想使用光标,也想计数,你可以试试这个方法

# Have 27 items in collection
db = MongoClient(_URI)[DB_NAME][COLLECTION_NAME]

cursor = db.find()
count = db.find().explain().get("executionStats", {}).get("nReturned")
# Output: 27

cursor = db.find().limit(5)
count = db.find().explain().get("executionStats", {}).get("nReturned")
# Output: 5

# Can also use cursor
for item in cursor:
      ...

您可以从www.example.com了解更多信息https://pymongo.readthedocs.io/en/stable/api/pymongo/cursor.html#pymongo.cursor.Cursor.explain

相关问题