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