Backend/MongoDB

MongoDB - 연산자

yxemsy 2022. 2. 2. 00:54
  • 쿼리의 형식
{ <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이므로 검색된다.