MongoDB 배열 내부의 문서 개수 세기
배열 필드 내부에 포함된 문서(요소)의 개수를 확인하려면 aggregate() 메서드와 함께 $project, $isArray, $size 연산자를 활용하면 됩니다.
먼저 예제로 사용할 컬렉션을 생성하고 문서를 삽입해 보겠습니다.
> db.demo332.insertOne({details:[{Name:"Chris",Age:21}]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e521f16f8647eb59e56208e")
}
> db.demo332.insertOne({details:[{Name:"David",Age:23},{Name:"Bob",Age:22}]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e521f21f8647eb59e56208f")
}저장된 문서 확인하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 조회할 수 있습니다.
> db.demo332.find();
위 쿼리는 다음과 같은 결과를 출력합니다.
{ "_id" : ObjectId("5e521f16f8647eb59e56208e"), "details" : [ { "Name" : "Chris", "Age" : 21 } ] }
{ "_id" : ObjectId("5e521f21f8647eb59e56208f"), "details" : [ { "Name" : "David", "Age" : 23 }, { "Name" : "Bob", "Age" : 22 } ] }첫 번째 문서의 details 배열에는 요소가 1개 있고, 두 번째 문서에는 2개가 있는 것을 확인할 수 있습니다.
배열 내부 문서 개수를 세는 쿼리
이제 aggregate() 메서드를 사용하여 각 문서의 배열 내부 요소 개수를 계산해 보겠습니다.
> db.demo332.aggregate([
... {
... $project: {
... numberOfDocuments: { $cond: { if: { $isArray: "$details" }, then: { $size: "$details" }, else: "No Documents"} }
... }
... }
... ] )이 쿼리의 동작 원리는 다음과 같습니다.
- $isArray: 해당 필드가 배열인지 여부를 검사합니다.
- $size: 필드가 배열일 경우 배열 내부의 요소 개수를 반환합니다.
- $cond: 조건 분기를 처리하며, 필드가 배열이 아니면 "No Documents"라는 문자열을 대신 반환합니다.
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{ "_id" : ObjectId("5e521f16f8647eb59e56208e"), "numberOfDocuments" : 1 }
{ "_id" : ObjectId("5e521f21f8647eb59e56208f"), "numberOfDocuments" : 2 }결과를 보면 첫 번째 문서는 배열 내부에 1개의 문서가, 두 번째 문서는 2개의 문서가 있는 것으로 정상적으로 집계된 것을 확인할 수 있습니다. 이처럼 $cond 조건문을 함께 사용하면 필드가 배열이 아닌 경우에도 오류 없이 안전하게 처리할 수 있다는 장점이 있습니다.