bestsource

MongoDB의 Pymongo에서 카운트()는 어떻게 하나요?

bestsource 2023. 7. 3. 23:01
반응형

MongoDB의 Pymongo에서 카운트()는 어떻게 하나요?

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

어떻게 해야 하나요?count()?

pymongo 버전 3.7.0 이상의 count()는 더 이상 사용되지 않습니다.대신 사용합니다. 실행 중cursor.count또는collection.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방법.최적화하기 위해 을 사용할 수 있습니다.이 메서드는 컬렉션 메타데이터를 기반으로 예상되는 문서 수(이름이 제안한 대로)를 반환합니다.

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()설정:

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:

이미 한계 '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의 대답에 유감스럽게도 논평할 수 없습니다...간단한 참고: 하지만,cursor.count()더 이상 사용되지 않습니다. 훨씬 더 빠릅니다.collection.count_documents()모든 테스트에서 컬렉션의 모든 문서를 (즉, 필터={}).입니다.db.currentOp()는 것을 밝힙니다.collection.count_documents()집계 파이프라인을 사용하는 동안cursor.count()Doesn't.원인일 수도 있습니다.

이 실은 11년 된 것입니다.그러나 2022년에는 'count()' 기능이 더 이상 사용되지 않습니다.다음은 제가 Python을 사용하여 MongoDB에서 문서를 세는 방법을 생각해 낸 것입니다.여기 코드 조각 사진이 있습니다.빈 목록을 작성할 필요가 없습니다. 저는 그저 특이하고 싶었을 뿐입니다.이것이 도움이 되기를 바랍니다 :).코드 조각입니다.

이 경우 주어진 쿼리에 대해 일치하는 요소의 수에 의존하며, 이 쿼리를 두 번 반복하지 않습니다.

하나는 카운트를 받고, 그리고.
결과 세트를 얻기 위해 2.

말도 안돼

쿼리 결과 집합이 그다지 크지 않고 메모리에 적합하다는 것을 알고 있으므로 목록으로 변환하여 목록 길이를 얻을 수 있습니다.

이 코드는 사용 사례를 보여줍니다.

# 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

커서를 사용하고 카운트도 원하는 경우 이 방법을 사용할 수 있습니다.

# 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:
      ...

자세한 내용은 https://pymongo.readthedocs.io/en/stable/api/pymongo/cursor.html#pymongo.cursor.Cursor.explain 에서 확인하실 수 있습니다.

수집에 모든 레코드 수(필터 없음)를 지정하려면 다음을 사용합니다.

from pymongo import MongoClient
cl = pymongo.MongoClient(host="localhost", port=27017)
db = cl["database_name"]
print(db.get_collection("collection_name").estimated_document_count())

언급URL : https://stackoverflow.com/questions/4415514/in-mongodbs-pymongo-how-do-i-do-a-count

반응형