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

MongoDB에서 배열의 모든 요소가 특정 값 이하인 문서를 조회하는 쿼리 방법

MongoDB에서 배열 필드의 모든 요소가 특정 값보다 작거나 같은 문서만 조회하려면 어떻게 해야 할까요? 이럴 때는 $not 연산자와 $gt(greater than) 연산자를 조합하면 간단하게 해결할 수 있습니다. 아래 예제를 통해 단계별로 살펴보겠습니다.

1. 샘플 컬렉션 생성하기

먼저 테스트용 컬렉션을 만들고 여러 개의 문서를 삽입합니다. 각 문서는 숫자 배열을 값으로 가지는 Scores 필드를 포함하고 있습니다.

> db.arrayElementsNotGreaterThanDemo.insertOne({"Scores":[89,43,32,45]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cd9e9f9b50a6c6dd317adb3")
}
> db.arrayElementsNotGreaterThanDemo.insertOne({"Scores":[32,33,34,40]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cd9ea13b50a6c6dd317adb4")
}
> db.arrayElementsNotGreaterThanDemo.insertOne({"Scores":[45,56,66,69]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cd9ea25b50a6c6dd317adb5")
}
> db.arrayElementsNotGreaterThanDemo.insertOne({"Scores":[46,66,77,88]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cd9ea3cb50a6c6dd317adb6")
}

2. 저장된 전체 문서 확인하기

find() 메서드와 pretty() 메서드를 함께 사용하면 컬렉션에 저장된 모든 문서를 보기 좋게 출력할 수 있습니다.

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

위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.

{
   "_id" : ObjectId("5cd9e9f9b50a6c6dd317adb3"),
   "Scores" : [
      89,
      43,
      32,
      45
   ]
}
{
   "_id" : ObjectId("5cd9ea13b50a6c6dd317adb4"),
   "Scores" : [
      32,
      33,
      34,
      40
   ]
}
{
   "_id" : ObjectId("5cd9ea25b50a6c6dd317adb5"),
   "Scores" : [
      45,
      56,
      66,
      69
   ]
}
{
   "_id" : ObjectId("5cd9ea3cb50a6c6dd317adb6"),
   "Scores" : [
      46,
      66,
      77,
      88
   ]
}

3. 배열의 모든 요소가 조건 이하인 문서 조회하기

핵심이 되는 쿼리는 다음과 같습니다. $not 안에 $gt: 45를 넣으면 "45보다 큰 요소가 하나도 없는" 문서, 즉 모든 배열 요소가 45 이하인 문서만 반환됩니다.

> db.arrayElementsNotGreaterThanDemo.find({Scores: {$not: {$gt:45}}});

실행 결과는 다음과 같습니다.

{ "_id" : ObjectId("5cd9ea13b50a6c6dd317adb4"), "Scores" : [ 32, 33, 34, 40 ] }

결과 분석

네 개의 문서 중 첫 번째 문서([89, 43, 32, 45])는 89라는 요소가 45보다 크기 때문에 제외되었습니다. 세 번째([45, 56, 66, 69])와 네 번째([46, 66, 77, 88]) 문서 역시 45를 초과하는 요소를 포함하고 있어 조회 대상에서 빠졌습니다. 반면 두 번째 문서([32, 33, 34, 40])는 모든 요소가 45 이하이므로 유일하게 조건을 충족합니다.

핵심 연산자 정리

  • $gt : 지정된 값보다 큰 값을 찾는 비교 연산자입니다. 배열 필드에 적용하면 요소 중 하나라도 조건을 만족하면 일치로 판단합니다.
  • $not : 뒤에 오는 조건식의 논리적 부정(NOT)을 수행합니다.
  • {Scores: {$not: {$gt: 45}}} : "45보다 큰 요소가 없는" 배열, 즉 모든 요소가 45 이하인 문서를 의미합니다.

이처럼 $not과 비교 연산자를 조합하면 배열 전체가 특정 조건을 만족하는지 손쉽게 확인할 수 있습니다.