web-dev-qa-db-ja.com

MongoDBのpymongoでは、count()をどのように行うのですか?

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

これは私の現在のコードです。

Count()を取得するにはどうすればよいですか?

27
TIMEX

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()で制限する場合は、 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:
_
29
thirtydot

すでに制限 '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が一致します

8
None-da

Pymongoバージョン3.7.0以降 count()は非推奨 です。代わりに Collection.count_documents を使用してください。 cursor.countまたはcollection.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 を使用できます。このメソッドは、コレクションのメタデータに基づいて、ドキュメントの推定数(推奨される名前として)を返します。

7
Sohaib Farooqi