본문 바로가기

Database/MongoDB

[MongoDB] 도큐먼트의 배열 필드내 요소 범위를 검사하는 쿼리

MongoDB에서는 $elemMatch 셀렉터를 사용해서 배열 내 요소이 특정 조건을 만족하는 쿼리를 작성할 수 있다.

이 때, $elemMatch로 걸린 조건을 배열 내 하나의 요소라도 만족하면 해당 조건을 가져오게 되는데 

다음과 같은 과제가 주어졌을 때에는 어떻게 쿼리를 짜야할 지 모를 수 있다. 

 

배열 안의 모든 요소가 3 ~ 6 사이인 document만 가져와라. 

db.test.insertMany([
    {item: "ABC", ratings: [2, 9], category_id: 10},
    {item: "XYZ", ratings: [4, 3], category_id: 10},
    {item: "ABC", ratings: [9], category_id: 20},
    {item: "ABC", ratings: [9, 10], category_id: 30},
    {item: "ABC", ratings: [2, 4], category_id: 30},
    { item: "ABD", ratings: [1, 2, 5], category_id: 10 },
    { item: "XPZ", ratings: [5, 9, 4, 3], category_id: 10 },
    { item: "AAC", ratings: [1, 9], category_id: 20 },
    { item: "AGC", ratings: [42, 9, 10], category_id: 30 },
    { item: "AHC", ratings: [3, 2, 4], category_id: 30 },
])

 

이럴 땐 $not과 $and를 사용해서 쿼리를 작성할 수 있다. 

 

db.survey.find({
  $and: [
    {
      ratings: {
        $not: {
          $elemMatch: { $lt: 3 },
        },
      },
    },
    {
      ratings: {
        $not: {
          $elemMatch: { $gt: 6 },
        },
      },
    },
  ],
});

$elemMatch가 배열 내 요소가 하나라도 만족을 하면 true가 되기 때문에

3보다 작은 요소가 하나라도 있거나, 6보다 큰 요소가 하나라도 있으면 거르는 쿼리이다.