TIL 28일차 - [데이터베이스] NoSQL : MongoDB CRUD_advanced

tamagoyakii·2022년 4월 28일
0

TIL

목록 보기
27/31
post-thumbnail

🌼 MongoDB Operator 🌼

연산자는 필드에 해당하는 값을 특정 값과 비교하여 조건을 충족시키기 위해 사용한다. 기본 형식은 다음과 같다.

{ field : { operator : value } }

🌷 비교 연산자(Comparison Operators)

특정 범위 내의 데이터를 찾기 위한 연산자다. 연산자가 지정되지 않을 경우 $eq가 기본 연산자로 사용된다.

  • $eq : equal to
  • $gt : greater than
  • $gte : greater than or equal to
  • $ne : not equal to
  • $lt : less than
  • $lte : less than or equal to

🌷 논리 연산자(Logic Operators)

여러 쿼리절에 대한 조건이기 때문에 연산자 뒤에 배열 구문으로 쿼리를 묶어준다.

{ 연산자 : [{ statement1 }, { statement2 }, ...] }

$and

"주어진 모든 쿼리절에 일치하는가"

{{"position": "top"}, {"type": "Slayer"}}
{$and: [{"position": "top"}, {"type": "Slayer"}]}

기본적으로 참이어야하는 여러 조건이 있는 경우 식에 함축되어있다. 위 예시의 두 구문은 같은 뜻이다. 동일한 필드에 여러 조건을 적용할 때도 마찬가지다.

{$and: [{"ability power": {"$gt": 35}}, {"ability power": {"$lt": 100}}]}
{"ability power": {"$gt": 35}, "ability power": {"$lt": 100}}
{"ability power": {"$gt": 35, "$lt": 100}}

위의 세 구문은 같은 조건을 이야기하고 있다. 즉, $and 연산자를 명시하지 않고 간단하게 쿼리를 작성할 수도 있다. 하지만 동일한 연산자를 두 번 이상 포함해야 할 때는 $and 연산자를 반드시 명시해야 한다.

$or

"주어진 쿼리절 하나라도 일치하는가"

$nor

"주어진 모든 쿼리절과 일치하지 않는가"

$not

"주어진 쿼리와 일치하지 않는가"
단순히 뒤에 오는 조건을 부정하기 때문에 배열 구문이 필요하지 않다. 아래와 같이 한 개의 조건만 써주면 된다.

{$not: {statement}}

🌷 표현 연산자(Expressive Query Operator)

$ 는 연산자를 표현할 때 사용된다. 하지만 이 외에 필드 값을 참조하는 경우에도 사용된다. 다음과 같이 특정 필드의 값을 변수처럼 비교할 수 있다.

{"$expr": {"$eq": ["$ability power", "$ability damage"]}}

$expr

$expr 연산자는 표현력이 풍부하여 하나 이상의 작업을 수행할 수 있다.

  1. 쿼리 내에서 집계 표현식(Aggregation Expression)을 사용할 수 있다.
{ $expr : { expression } } 
  1. 변수와 조건문을 사용할 수 있다.
  2. 같은 도큐먼트 내의 필드들을 서로 비교할 수 있다.

🌷 배열 연산자(Array Operators)

$push

"배열의 마지막 위치에 요소를 추가한다."
배열 타입이 아닌 필드에 사용할 경우, 해당 필드의 타입을 배열로 바꾼다. 이전 MongoDB CRUD 파트의 Update 부분에 상세하게 적혀있다.

$all

"배열 필드에 지정한 요소가 있는 모든 도큐먼트를 반환한다."
도큐먼트를 찾을 때, 배열 타입 필드의 경우 요소의 순서가 결과에 영향을 미친다. 예를 들어,

{"counter": ["Ezreal", "Samira", "Caitlyn"]}
{"counter": ["Caitlyn", "Ezreal", "Samira"]}

위의 두 쿼리는 서로 다른 결과를 보여준다. 요소의 순서와 관계 없이 결과를 도출하고 싶을 때 $all 연산자를 사용하면 된다.

{"counter": {"$all": ["Ezreal", "Samira", "Caitlyn"]}}

$all을 사용하면 배열 요소의 순서와 상관없이 지정된 요소가 포함된 모든 도큐먼트를 찾을 수 있다.

$size

지정된 배열 필드가 주어진 길이와 정확히 일치하는 모든 도큐먼트들이 있는 커서를 반환한다.

{"counter": {"$size": 5, "$all": ["Ezreal", "Samira", "Caitlyn"]}}

위의 쿼리는 "카운터" 배열에 "이즈리얼, "사미라", "케이틀린"을 포함한 5개의 요소가 있는 도큐먼트들만 반환한다.

🌷 Projection과 $elementMatch

Projection

다음과 같이 두 번재 인자로 projection을 추가할 경우 원하는 인자만 결과로 받을 수 있다.

db.collection.find({<query>}, {<projection>})

기본적으로 01을 사용하여 포함 유무를 표현할 수 있다.

lol.champions.find({"position": "top"}, {"skills": 0, "abilities": 0})
lol.champions.find({{"position": "supporter"}}, {"name": 1, "type": 1})

여기서 1은 포함, 0은 미포함을 뜻한다. 1을 사용할 경우 해당 필드와 _id 필드만 출력되며, 0을 사용할 경우 해당 필드를 제외한 모든 필드가 출력된다. 1과 0을 혼용할 수 있는 유일한 경우는 디폴트로 포함되는 _id 필드를 제외하도록 특별히 요청할 때이다.

$elementMatch

$elementMatch 는 find 명령의 쿼리 및 프로젝션 부분에서 모두 사용할 수 있는 배열 연산자다.

{<field>: {"$elementMatch": {<field>: <value>}}}
  1. 첫 번째 인자로 사용되는 경우 (query)
lol.champions.find({"abilities": {"$elementMatch": {"ability damage": {"$gt": 200}}})

지정된 쿼리와 일치하는 요소가 하나 이상 있는 배열 필드를 가지고 있는 모든 도큐먼트를 찾는다. 쿼리로 사용되었기 때문에 반환되는 결과에는 도큐먼트의 모든 필드가 포함된다.

  1. 두 번째 인자로 사용되는 경우 (projection)
lol.champions.find( {"type": "Mage"},
			{"abilities": {"$elementMatch": {"ability power": {"$gt": 80}}} }

$elementMatch프로젝션으로 사용되었기 때문에 지정된 기준과 일치하는 요소가 하나 이상 있는 배열 요소만 결과에 포함된다.

0개의 댓글