[MongoDB] 트랜잭션 명령어, 비교 연산자, 문자열 연산자
MongoDB
→ 트랜잭션 명령어, 비교 연산자, 문자열 연산자
트랜잭션 명령어
session = db.getMongo().startSession()
session.startTransaction({
readConcern: { level: "snapshot"},
writeConcern: {w:"majorityu"}
})
<원하는 작업 수행>
session.commitTransaction();
session.endSession();
샤딩된 환경에서의 트랜잭션은 4.2버전 이상부터 가능
WriteConcern과 ReadConcern값을 startTransaction 실행시 제대로 설정해주서야 문제가 발생하더라고 손실피해를 줄일 수 있음
트랜잭션은 도큐먼트 생성, 읽기, 수정, 삭제시 가능하지만 그 외 명령어는 불가능(예:컬렉션 생성 및 삭제)
비교연산자
- $eq (equals) 주어진 값과 일치하는 값
- $ne (not equals) 주어진 값과 일치하지 않는 값
- $gt (greater than) 주어진 값보다 큰 값
- $gte (greater than or equals) 주어진 값보다 크거나 같은 값
- $lt (less than) 주어진 값보다 작은 값
- $lte (less than or equals) 주어진 값보다 작거나 같은 값
- $in
주어진 배열 안에 속하는 값
ex) db.inventory.find({tags: {$in: [/^[a-z]la/]}})
- $nin
(not in) 주어진 배열안에 속하지 않는 값
ex) db.inventory.find({tags: {$nin: [/^[a-z]la/]}})
// 사용예시 1
/* 키는 180 이상이면서 몸무게는 60킬로그램 이하인 사람 필터링 */
{height: {$gte:180}, weight: {$lte:60}}
// 사용예시 2 ($and, $or, $nor)
{ $or: [
{status:"A"},
{qty:{$lt:30}}
]
}
사실 $or 혹은 $nor 연산자는 사용할 일이 종종 있지만, $and 연산자는 사용할 일이 흔치 않다.
그 이유는 이러한 논리연산자를 사용하지 않고도 간단하게 표현할 수 있기 때문.
db.inventory.find({
$and: [
{qty: {$gt:10}},
{qty: {$lt:100}}
]
})
↓ 더 간단하게 표현한 방법 ↓
db.inventory.find({qty: {$gt:10, $lt:100}})
그렇다고 $and 연산자를 사용할 일이 없는 것은 아니다. 다음과 같이 논리연산자를 복합적으로 사용할때 활용된다.
db.inventory.find({
$and: [
{$or : [ {price : 0.99}, {price : 1.99} ]},
{$or : [ {sale : true}, {qty : {$le : 20}} ]},
]
})
문자열 연산자
- $regex
형식이 3가지
// 첫번째 형식
{<filed>: {$regex: /pattern/, $options: '<options>'}}
// 두번째 형식
{<filed>: {$regex: 'pattern', $options: '<options>'}}
// 세번째 형식
{<filed>: {$regex: /pattern/<options>}}
<options>에 들어갈 수 있는 옵션의 종류는 4가지.
- i - 대소문자 무시
- m - 정규식에 앵커(^) 사용시 값에 \n이 있다면 무력화
- x - 정규. 안에 있는공백 모두 무시
- s - 점(.) 사용시 \n을 포함해서 매치
일반적으로 검색할때 정규식 하나로만 사용하지 않음. 그 이유는 $regex를 사용하지 않고도 표현할 수 있기 때문.
예시) db.articles.find( {"title": /article0[1-9]i/} )
$regex를 사용하는 경우는 하나의 필드에 ‘여러 연산자’를 적용하려고 할 때 활용.
db.articles.find({
title: { $regex: /aricle0[1-9]/i, $not: /aricle03/}
})
$text 연산자
- $text 연산자 사용을 위한 인덱스 등록 ($text 연산자 사용 전 필수 작업)
db.컬렉션명.createIndex({name:"text", decription:"text"})
- $text 연산자 사용한 검색 ($search 옵션 활용 필요)
db.컬렉션명.find({ $text: {$search:"coffee"}})
// 결과값
{"_id" : 3, "name" : "Coffee shopping", "description" : "Just coffee"}
{"_id" : 1, "name" : "Java Hut", "description" : "Coffee and cakes"}
대소문자 구분없이 검색된다는 특징.
- 띄어쓰기를 하면 각 띄어쓰기를 기준으로 각 단어를 모두 검색
db.컬렉션명.find({ $text: {$search:"bake coffee cake"}})
// 결과값
{"_id" : 1, "name" : "Java Hut", "description" : "Coffee and cakes"}
{"_id" : 3, "name" : "Coffee shopping", "desciption" : "Just coffee"}
- 띄어쓰기를 포함한 단어를 검색하고자 할때 → 단어를 쌍따옴표로 감싼 후, 감싼 쌍따옴표를 이스케이핑(\)
db.컬렉션명.find({ $text : {$search : "\"coffee shop\""})
// 결과값
{"_id" : 3, "name" : "Coffee Shopping", "description" : "Just coffee"}
해당 언어의 원형을 통해서 진행형 및 과거형도 검색이 된다는 특징.
필드 및 설명 |
---|
$ search : 검색하려는 내용을 담는다. 구절로 설정되지 않으면 띄어 쓴 단어를 포함한 모든 도큐먼트를 불러온다. |
$language : (선택) 검색하는 언어를 설정. MongoDB가 지원하는 언어를 설정할 수 있다. 설정되지 않으면 인덱스에 설정된 내용을 따른다. |
$caseSensitive : (선택) 불린값을 가지며, 문자의 대소문자를 구분할지 정한다. |
$diacriticSensitive : (선택) 불린값을 가지며, 알파벳 위아래에 붙이는 기호를 무시할지를 정한다(기본값 false) |
// 문법
{
$text :
{
$search : <string>,
$language : <string>,
$caseSensitive : <boolean>,
$diacriticSensitive : <boolean>
}
}
Leave a comment