Computer >> 컴퓨터 >  >> 프로그래밍 >> MongoDB

MongoDB에서 배열 필드가 비어 있지 않은 레코드를 조회하는 방법

MongoDB에서 배열 필드에 값이 하나 이상 들어 있는 문서만 조회하고 싶다면 $ne(Not Equal, 같지 않음) 연산자를 활용하면 됩니다. 이 연산자를 $exists와 함께 사용하면 해당 필드가 존재하면서 동시에 빈 배열이 아닌 문서를 정확하게 걸러낼 수 있습니다.

예제 컬렉션 생성하기

개념을 이해하기 위해 먼저 샘플 문서들이 담긴 컬렉션을 만들어 보겠습니다. 아래 쿼리는 학생 이름과 기술 과목 배열을 포함하는 문서들을 삽입합니다.

> db.arrayFieldIsNotEmptyDemo.insertOne({"StudentName":"Larry","StudentTechnicalSubject":["Java","C"]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c76fe2f1e9c5dd6f1f78291")
}
> db.arrayFieldIsNotEmptyDemo.insertOne({"StudentName":"Mike","StudentTechnicalSubject":[]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c76fe3b1e9c5dd6f1f78292")
}
> db.arrayFieldIsNotEmptyDemo.insertOne({"StudentName":"Sam","StudentTechnicalSubject":["MongoDB"]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c76fe491e9c5dd6f1f78293")
}
> db.arrayFieldIsNotEmptyDemo.insertOne({"StudentName":"Carol","StudentTechnicalSubject":[]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c76fe521e9c5dd6f1f78294")
}
> db.arrayFieldIsNotEmptyDemo.insertOne({"StudentName":"David","StudentTechnicalSubject":["MySQL","SQL Server"]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c76fe661e9c5dd6f1f78295")
}

위 예제에서 Larry, Sam, David는 배열에 실제 과목이 들어 있고, Mike와 Carol은 빈 배열([])을 가지고 있습니다.

전체 문서 확인하기

find() 메서드를 사용해 컬렉션의 모든 문서를 출력해 보겠습니다.

> db.arrayFieldIsNotEmptyDemo.find().pretty();

출력 결과

{
   "_id" : ObjectId("5c76fe2f1e9c5dd6f1f78291"),
   "StudentName" : "Larry",
   "StudentTechnicalSubject" : [
      "Java",
      "C"
   ]
}
{
   "_id" : ObjectId("5c76fe3b1e9c5dd6f1f78292"),
   "StudentName" : "Mike",
   "StudentTechnicalSubject" : [ ]
}
{
   "_id" : ObjectId("5c76fe491e9c5dd6f1f78293"),
   "StudentName" : "Sam",
   "StudentTechnicalSubject" : [
      "MongoDB"
   ]
}
{
   "_id" : ObjectId("5c76fe521e9c5dd6f1f78294"),
   "StudentName" : "Carol",
   "StudentTechnicalSubject" : [ ]
}
{
   "_id" : ObjectId("5c76fe661e9c5dd6f1f78295"),
   "StudentName" : "David",
   "StudentTechnicalSubject" : [
      "MySQL",
      "SQL Server"
   ]
}

배열이 비어 있지 않은 문서만 조회하기

이제 핵심인 쿼리입니다. $exists: true로 필드의 존재 여부를 확인하고, $ne: []로 빈 배열을 제외합니다.

> db.arrayFieldIsNotEmptyDemo.find({StudentTechnicalSubject:{$exists:true,$ne:[]}}).pretty();

출력 결과

{
   "_id" : ObjectId("5c76fe2f1e9c5dd6f1f78291"),
   "StudentName" : "Larry",
   "StudentTechnicalSubject" : [
      "Java",
      "C"
   ]
}
{
   "_id" : ObjectId("5c76fe491e9c5dd6f1f78293"),
   "StudentName" : "Sam",
   "StudentTechnicalSubject" : [
      "MongoDB"
   ]
}
{
   "_id" : ObjectId("5c76fe661e9c5dd6f1f78295"),
   "StudentName" : "David",
   "StudentTechnicalSubject" : [
      "MySQL",
      "SQL Server"
   ]
}

결과를 보면 빈 배열을 가진 Mike와 Carol의 문서는 제외되고, 배열에 실제 데이터가 있는 세 개의 문서만 반환된 것을 확인할 수 있습니다.

추가 팁: $gt 연산자 활용하기

같은 결과를 얻는 또 다른 방법으로 $gt 연산자를 사용할 수도 있습니다. MongoDB에서는 빈 배열보다 큰 값을 비교하는 방식으로 요소가 있는 배열만 필터링할 수 있습니다.

> db.arrayFieldIsNotEmptyDemo.find({StudentTechnicalSubject: {$exists: true, $not: {$size: 0}}}).pretty();

또는 $size 연산자와 $not을 조합해 배열 크기가 0이 아닌 문서를 찾는 방법도 있습니다. 상황에 따라 가장 읽기 쉬운 방식을 선택해 사용하면 됩니다.