MongoDB - 연산자
- 쿼리의 형식
{ <field>: {<operator1>:<value>,<operator2>:<value>}, <field>: ... }
필드가 가장 바깥이고, 안쪽에 연산자가 들어간다.
예외적으로 $or, $and, $nor 연산자는 가장 바깥에 쓰인다.
{ "$or": [ { "name": "hayan" }, { "age": { "$eq": 25 } } ] }
이런식으로 $or 연산자를 사용할 수 있다.
예시 코드에서 $eq 연산자는 해당 값과 일치하는 필드를 찾는다.
- 점 표기법
BSON 내부의 Object에 접근하기 위한 방법이다.
{
"name":{"first": "yu", "last": "hayan" },
"age": 25
}
{ "name.first": "yu" }
위 도큐먼트에서 name의 first 값을 받고 싶으면,
코드의 마지막 줄 처럼 점(.)을 이용하여 접근이 가능하다.
{
"name":{"first": "yu", "last": "hayan" },
"age": 25
"hobby": ["dance", "exercise"]
}
{"hobby.0": "dance"}
위 도큐먼트에서 hobby 배열의 값을 받고 싶으면,
코드의 마지막 줄 hobby.0 처럼 인덱스 번호로 접근이 가능하다.
- 비교 연산자 종류
$eq | (equals) 주어진 값과 일치하는 값 |
$gt | (greater than) 주어진 값보다 큰 값 |
$gte | (greater than or equals) 주어진 값보다 크거나 같은 값 |
$lt | (less than) 주어진 값보다 작은 값 |
$lte | (less than or equals) 주어진 값보다 작거나 같은 값 |
$ne | (not equals) 주어진 값과 일치하지 않는 값 |
$in | 주어진 배열 안에 속하는 값 |
$nin | 주어진 배열 안에 속하지 않는 값 |
1) 대소 비교 쿼리 예시
user.find( { "age": { "$gt": 20, "$lt": 30} } )
user 컬렉션에서 age가 20 초과, 30미만인 도큐먼트 검색
2) 포함 쿼리 예시
user.find( { "age": { "$in": [ 20, 30] } } )
age가 20 또는 30인 user 도큐먼트 검색
user.find( { "join_date": { "$nin": [
re.compile("^2021"),
re.compile("^2022")
]} } )
가입날짜가 정규표현식 ^2021 또는 ^2022에 일치 않는 도큐먼트 검색
- 논리 연산자
$or | 주어진 조건 중 하나라도 true일 때 true |
$and | 모든 조건이 true일 때 true |
$nor | 주어진 조건 중 하나라도 false일 때 true |
$not | 주어진 조건이 false일 때 true |
1) $or 연산자 예시
user.find({ "$or": [ { "name": "hayan" }, { "age": "20" } ] })
name이 hayan 이거나 age가 20인 도큐먼트 검색
2) $not 연산자 예시
user.find({ "age": { "$not": { "$lte": 20} } })
age가 20 이하가 아닌 도큐먼트 검색
- 문자열 연산자
$mod | 그 필드에 modulo operation을 통해 특정 결과가 나온 도큐먼트 선택 |
$regex | 특정 정규 표현식과 맞는 도큐먼트 선택 |
$text | 문자열 검색 기능 |
$where | 자바스크립트로 알맞은 도큐먼트 선택 |
1) 정규표현식 예시
user.find( { "title" : { "$regex":'article0[1-2]' } } )
제목이 article01, article02인 도큐먼트를 검색한다.
2) $text 연산자 예시
{
"$text": {
"$search": <string>, # 검색할 내용
"$language": <string>, # 검색하는 언어(선택적)
"$caseSensitive": <boolean>, # false일 경우 대소문자 무시함. false가 기본값 (선택적)
"$diacriticSensitive": <boolean> # ğ와g 같은 문자를 구분할지 선택. false가 기본값 (선택적)
}
user.find( { "$text": { "$search": "dance" } } )
}
예시코드의 마지막 코드는 "dance"라는 문자열이 포함된 모든 도큐먼트를 검색한다.
dancing과 같은 진행형도 스스로 검색이 가능하며 과거형도 검색해준다.
user.find( { "$text": { "$search": "\"dance studio\"" } } )
# \" \" 안에 문자열을 작성하면 두 단어가 포함된 도큐먼트 검색
user.find( { "$text": { "$search": "dance studio" } } )
# dance 혹은 studio 둘 중 하나만 포함되어도 검색
첫 줄의 경우에는 dance만 포함되어있으면 검색을 하지 않는다. 즉, 구절을 검색한다.
두 번째 줄의 경우는 dance만 포함되어도 검색을 한다. 즉, 여러 단어를 검색한다.
- 배열 연산자
$all | 순서와 상관없이 배열 요소가 모두 포함되면 선택 |
$elemMatch | 조건과 맞는 배열 속 요소를 가진 도큐먼트 선택 |
$size | 해당 배열의 크기가 같은 도큐먼트 선택 |
1) $all 연산자 예시
user.find( { "hobby": { "$all": [ "dance", "exercise"] } } )
hobby 배열 안에 dance와 exercise 두 요소가 모두 있다면 그 도큐먼트를 검색한다.
2) $elemMatch 연산자 예시
user.find({ "age": { "$elemMatch": { "$gte": 20, "$lt": 30} } })
age라는 배열에 20~30의 요소가 있으면 그 도큐먼트를 검색한다.
3) $size 연산자 예시
user.find( {"hobby": {"$size": 3} } )
어떤 도큐먼트의 hobby가 [ "dance", "exercise", "book" ] 이라면 배열의 크기가 3이므로 검색된다.