MongoDB에서 커서 반복 횟수 계산하기
MongoDB에서는 커서(cursor)의 반복 횟수를 직접 반환하는 내장 메서드가 없기 때문에, find() 커서와 함께 while 루프를 활용한 사용자 정의 로직을 작성해야 합니다. 커서의 hasNext() 메서드로 다음 문서의 존재 여부를 확인하고, next() 메서드로 문서를 하나씩 가져오면서 조건에 맞는 문서 수를 직접 카운트하는 방식입니다.
먼저 문서가 포함된 컬렉션을 생성해 보겠습니다.
> db.demo724.insertOne(
... {
... details:
... {
... id:101,
... otherDetails:[
... {Name:"Chris"}
... ]
... }
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5eab0cce43417811278f5890")
}
>
>
> db.demo724.insertOne(
... {
...
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5eab0cce43417811278f5891")
}
> db.demo724.insertOne(
... {
... details:
... {
... id:1001
... }
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5eab0cce43417811278f5892")
}find() 메서드로 전체 문서 조회하기
생성한 컬렉션의 모든 문서를 확인하려면 find() 메서드를 사용합니다.
> db.demo724.find();
위 쿼리는 다음과 같은 결과를 출력합니다.
{ "_id" : ObjectId("5eab0cce43417811278f5890"), "details" : { "id" : 101, "otherDetails" : [ { "Name" : "Chris" } ] } }
{ "_id" : ObjectId("5eab0cce43417811278f5891") }
{ "_id" : ObjectId("5eab0cce43417811278f5892"), "details" : { "id" : 1001 } }총 3개의 문서 중 두 번째 문서에는 details 필드가 없다는 점에 주목하세요. 이제 특정 필드가 존재하는 문서만 골라 커서 반복 횟수를 세어 보겠습니다.
while 루프로 커서 반복 횟수 계산하기
다음은 MongoDB에서 커서의 반복 횟수를 계산하는 쿼리입니다. hasNext()로 문서가 남아 있는지 확인하고, next()로 현재 문서를 가져온 뒤 typeof 연산자로 details 필드의 존재 여부를 검사합니다.
> var c=db.demo724.find();
> var detailsCount=0;
> while (c.hasNext()) {
... var current = c.next();
... if (typeof current["details"] != "undefined") {
... detailsCount++;
... }
... }
1
> print("number of details: " + detailsCount);실행 결과는 다음과 같습니다.
number of details: 2
코드 설명
- var c = db.demo724.find(); — 컬렉션의 모든 문서를 담은 커서 객체를 변수 c에 저장합니다.
- c.hasNext() — 커서에 아직 읽지 않은 문서가 남아 있는지 확인하며, 문서가 있으면 true를 반환합니다.
- c.next() — 커서에서 다음 문서를 하나 가져옵니다.
- typeof current["details"] != "undefined" — 현재 문서에 details 필드가 존재하는지 검사하여, 존재할 경우에만 카운터를 증가시킵니다.
결과적으로 전체 3개의 문서 중 details 필드를 가진 문서는 2개이므로, 최종 출력값은 2가 됩니다. 이처럼 while 루프와 조건문을 조합하면 단순 문서 개수뿐 아니라 특정 조건을 만족하는 문서의 반복 횟수도 유연하게 계산할 수 있습니다.