🖇️ Operators & Complex Queries
이번에는 mongdoDB의 연산자, 복잡한 쿼리를 다뤄 보도록 하겠다. 이전 포스팅에서는 데이터를 필터링 하는법을 잠깐 배웠는데, 이번에는 필터링에 연산자를 추가해 조금 더 나은 기능을 써보자. 이전 필터링에서는 db.books.find({rating : 7})을 하여 books 컬렉션에 있는 모든 데이터중 rating : 7을 가진 document를 가져오는 로직을 수행했었는데, 이번에는 rating이 7 이상인 document만 가져와 보여주는 로직을 수행해보자.
사실 연산자로 제일 직관적인 부등호를 쓸 줄 알았지만, 달러사인과 특정 커맨드를 이용하니 좀 당황스러웠다. 여기서
.find({ rating : {$gt : 7}})은, rating이 7보다 큰 값들을 찾아 반환한다.(여기서 rating이 7인 값들은 포함되지 않는다.) 즉, $gt는 >= 가 아닌 >와 같다.
- $gt : greater than
- $lt : less than
만약 여기서 < , >가 아니라 크거나 같다면을 하고싶다면,
- gte : greater than or equal
- lte : less than or equal
커맨드를 사용하면 된다.
이제 우리가 또 많이 사용하는 or 연산자에 대해 알아보자. 프로그래밍에서 or은 여러가지의 조건이 주어졌을때, 단 하나라도 만족하면 '참'을 반환한다. 아래 예시는 books 컬렉션에서 rating이 7이거나 9인 책들을 반환하는 커맨드이다.
db.books.find({$or : [{rating : 7}, {rating : 9}]})
먼저, find를 통해 모든 document를 참조하고, $or을 사용한다. 여기서 or은 : 뒤에 오는것들로 구분지어지는데, []로 배열안에 {}를 포함시켜 조건들을 넣어준다.
🖇️ $in, $nin
🟢 $in
$in 연산자는 주어진 배열의 특정 값들과 일치하는지 확인하는 데 사용된다. 예시를 보자.
위 커맨드를 살펴보자. 먼저, .find()로 books 컬렉션의 모든 document를 참조하고, find의 파라미터로 { rating : }을 주어 find()가 반환한 모든 document의 rating을 참조한다. 여기서 rating : {$in : [7,8,9]}는 rating이 7이거나 8이거나 9인 document를 찾아 반환한다.
이렇게 보면 위에서 배운 or이랑 뭐가 다른건가 싶은 생각이 들것이다. $in : [7,8,9]는 $or : [{rating : 7}, {rating : 8}, {rating : 9}]와 같다. 하지만 단순히 코드의 길이로 보더라도 $in을 쓰는것이 훨씬 짧고 직관적이다.
🟢 $nin
눈치가 빠르다면 $nin은 not-in의 줄임말 이라는것을 알 수 있다. 즉, $in은 특정 범위 안에 있는 값들을 반환했다면, $nin은 이 범위안에 해당되지 않는 값들을 반환하려 할 것이다.
위를 보면, rating이 7,8,9가 아닌 모든 document를 반환하는 커맨드이다.
'Database' 카테고리의 다른 글
[MongoDB] 데이터 필터링, Nested Document - (3) (4) | 2024.07.25 |
---|---|
[MongoDB] MongoDB - Compass, Shell을 이용한 데이터 삽입 - (2) (3) | 2024.07.24 |
[MongoDB] MongoDB 알아보기 - (1) (1) | 2024.07.24 |