-
[MongoDB] collection.count(), collection.countDocuments({})Software Development/Database 2022. 1. 14. 00:48
MongoDB에서 흔히 전체 문서가 얼마나 저장되어 있는지 세기 위해서 db.collection.find({}).count(), db.collection.count()를 실행합니다.
그러나 위의 방법은 권장하지 않습니다. 왜냐하면 find({}) 처럼 쿼리에 조건이 없거나 그냥 count()를 실행할 경우, 메타데이터에서 값을 가져오기 때문입니다. 메타데이터에서 값을 가져오기 때문에 실행하면 굉장히 빠르게 값을 반환하는 것을 볼 수 있습니다.이런 현상은 몽고디비가 샤딩됐을 때, 고아 문서가 적절히 필터링되지 못하거나
몽고디비가 비정상적으로 종료하게 되면 count가 적절하지 않을 수 있습니다.Wired Tiger storage engine을 쓰는 mongod가 비정상적으로 종료됐을 때 count()가 이상할 수 있습니다.
이런 잘못된 값, 즉 실제 count()와 차이가 나는 이유는 count()의 마지막 checkpoint와 비정상적인 종료 사이에 수행된 입력, 수정, 삭제된 양에 따라 다릅니다.
checkpoint는 기본적으로 60초마다 발생하는데, non-default --syncdelay settings와 함께 실행되는 mongod는 시간이 더 길거나 짧을 수 있습니다.위 통계값을 복원하려면 mongod의 각 컬렉션에 대해서 validate를 실행해야 합니다(관리자 권한으로).
Mongodb 버전 5.0부터는 validate 명령은 컬렉션의 불일치를 찾아내고 가능한 경우에는 수정을 합니다.
collection.countDocuments() 명령어는 정확한 count 값을 반환하니 이를 대신하여 사용할 수 있습니다.[1] https://docs.mongodb.com/manual/reference/method/db.collection.count/
[2] https://docs.mongodb.com/manual/reference/command/validate/#mongodb-dbcommand-dbcmd.validate'Software Development > Database' 카테고리의 다른 글
[MongoDB] Compound Index 생성해도 왜 쿼리가 느리지? (0) 2022.05.31 데이터베이스 인터널스 (0) 2022.04.27 [데이터 중심 애플리케이션] 스트림 처리 (0) 2022.01.09 [데이터 중심 애플리케이션] 일괄 처리 (0) 2021.12.26 [데이터 중심 애플리케이션 설계] 일관성과 합의 (0) 2021.12.05