연산자는 필드에 해당하는 값을 특정 값과 비교하여 조건을 충족시키기 위해 사용한다. 기본 형식은 다음과 같다.
{ field : { operator : value } }
특정 범위 내의 데이터를 찾기 위한 연산자다. 연산자가 지정되지 않을 경우 $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
여러 쿼리절에 대한 조건이기 때문에 연산자 뒤에 배열 구문으로 쿼리를 묶어준다.
{ 연산자 : [{ statement1 }, { statement2 }, ...] }
"주어진 모든 쿼리절에 일치하는가"
{{"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
연산자를 반드시 명시해야 한다.
"주어진 쿼리절 하나라도 일치하는가"
"주어진 모든 쿼리절과 일치하지 않는가"
"주어진 쿼리와 일치하지 않는가"
단순히 뒤에 오는 조건을 부정하기 때문에 배열 구문이 필요하지 않다. 아래와 같이 한 개의 조건만 써주면 된다.{$not: {statement}}
$
는 연산자를 표현할 때 사용된다. 하지만 이 외에 필드 값을 참조하는 경우에도 사용된다. 다음과 같이 특정 필드의 값을 변수처럼 비교할 수 있다.
{"$expr": {"$eq": ["$ability power", "$ability damage"]}}
$expr 연산자는 표현력이 풍부하여 하나 이상의 작업을 수행할 수 있다.
- 쿼리 내에서 집계 표현식(Aggregation Expression)을 사용할 수 있다.
{ $expr : { expression } }
- 변수와 조건문을 사용할 수 있다.
- 같은 도큐먼트 내의 필드들을 서로 비교할 수 있다.
"배열의 마지막 위치에 요소를 추가한다."
배열 타입이 아닌 필드에 사용할 경우, 해당 필드의 타입을 배열로 바꾼다. 이전 MongoDB CRUD 파트의 Update 부분에 상세하게 적혀있다.
"배열 필드에 지정한 요소가 있는 모든 도큐먼트를 반환한다."
도큐먼트를 찾을 때, 배열 타입 필드의 경우 요소의 순서가 결과에 영향을 미친다. 예를 들어,{"counter": ["Ezreal", "Samira", "Caitlyn"]} {"counter": ["Caitlyn", "Ezreal", "Samira"]}
위의 두 쿼리는 서로 다른 결과를 보여준다. 요소의 순서와 관계 없이 결과를 도출하고 싶을 때
$all
연산자를 사용하면 된다.{"counter": {"$all": ["Ezreal", "Samira", "Caitlyn"]}}
$all
을 사용하면 배열 요소의 순서와 상관없이 지정된 요소가 포함된 모든 도큐먼트를 찾을 수 있다.
지정된 배열 필드가 주어진 길이와 정확히 일치하는 모든 도큐먼트들이 있는 커서를 반환한다.
{"counter": {"$size": 5, "$all": ["Ezreal", "Samira", "Caitlyn"]}}
위의 쿼리는 "카운터" 배열에 "이즈리얼, "사미라", "케이틀린"을 포함한 5개의 요소가 있는 도큐먼트들만 반환한다.
다음과 같이 두 번재 인자로 projection을 추가할 경우 원하는 인자만 결과로 받을 수 있다.
db.collection.find({<query>}, {<projection>})
기본적으로
0
과1
을 사용하여 포함 유무를 표현할 수 있다.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
는 find 명령의 쿼리 및 프로젝션 부분에서 모두 사용할 수 있는 배열 연산자다.{<field>: {"$elementMatch": {<field>: <value>}}}
- 첫 번째 인자로 사용되는 경우 (query)
lol.champions.find({"abilities": {"$elementMatch": {"ability damage": {"$gt": 200}}})
지정된 쿼리와 일치하는 요소가 하나 이상 있는 배열 필드를 가지고 있는 모든 도큐먼트를 찾는다. 쿼리로 사용되었기 때문에 반환되는 결과에는 도큐먼트의 모든 필드가 포함된다.
- 두 번째 인자로 사용되는 경우 (projection)
lol.champions.find( {"type": "Mage"}, {"abilities": {"$elementMatch": {"ability power": {"$gt": 80}}} }
$elementMatch
가 프로젝션으로 사용되었기 때문에 지정된 기준과 일치하는 요소가 하나 이상 있는 배열 요소만 결과에 포함된다.