3 분 소요

MongoDB 연산자

비교 연산자

  • $eq : EQual to (=)
  • $ne : Not Equal to (!=)
  • $gt : Greater Than (>)
  • $lt : Les Than (<)
  • $gte : Greater Than or Equal to (>=)
  • $lte : Less Than or Equal to (<=)
**{field:{operator:value}}**
$eq는 연산자가 지정되어 있지 않은 경우 기본 연산자로 사용됨

논리 연산자

  • $and : 주어진 모든 쿼리절과 일치. 연산자가 지정되지 않았을 때 기본 연산자로 사용됨. 동일한 연산자를 두번 이상 포함히야 할 때는 $and 명시
  • $or : 주어진 쿼리절 하나라도 일치
  • $nor : 주어진 모든 쿼리절과 일치하지 않음
    **{operator:[{ statement1}, {statement2}, ...]}**
  • $not : 주어진 쿼리와 일치하지 않음
    **{$not:{statement}}**

표현 연산자

  • $expr
    • 쿼리 내에서 집계 표현식 사용 {$expr:{<expression>}}
    • 변수와 조건문 사용 가능
    • 같은 도큐먼트 내의 필드들을 서로 비교
  • $
    • 연산자를 사용할 때를 나타냄
    • 필드 이름 자체가 아니라 해당 필드의 값을 향하고 있음을 나타냄
      **{operator:{field,value}**

배열 연산자

  • $push : 배열의 마지막 위치에 엘리먼트 삽입. 배열이 아닌 필드에 사용했을 경우, 필드의 타입을 배열로 바꿈. 배열 필드를 쿼리할 때, 배열 요소의 순서가 영향을 미친다.
  • $all : 배열 필드에 지정한 요소가 있는 모든 도큐먼트 반환. 배열 요소의 순서와 상관없이 지정된 요소가 포함된 모든 도큐먼트 찾을 수 있다.
  • $size : 반환하는 결과값 지정.

지정된 배열 필드가 주어진 길이와 정확히 일치하는 모든 도큐먼트들이 있는 커서 반환 : {array field:{"$size":number}

지정된 배열 필드의 배열 순서와 관계없이 지정된 모든 요소가 포함된 모든 도큐먼트들이 있는 커서를 반환 : {array field:{"$all":array}

배열 필드를 배열 연산자를 쓰지 않고 쿼리할 때

지정된 배열 필드에 요소와 순서가 정확히 일치하는 배열을 가진 도큐먼트 찾기 : {array field:array}

지정된 배열 필드에 문자열로 주어진 요소가 포함된 모든 도큐먼트 찾기 : {array field:string}

베열 연산자와 Projection

  • Projection
    • db.collection.find({query},{projection})
    • projection에서 0과 1을 사용하여 특정 필드를 포함 또는 제외할지 여부를 지정할 수 있다. 혼용은 불가
    • 예외적으로 디폴트로 포함되는 _id 필드를 명시적으로 제외하는 경우 혼용 가능 {"_id:0",field:1}
  • $elemMatch
    • {field:{“$elemMatch”:{field:value}}}
    • 첫번째 인자에 쓰일 경우, 배열 필드의 서브 도큐먼트 필드가 쿼리와 일치하는 문서 검색
    • 두번째 인자에 쓰일 경우, 지정된 기준과 일치하는 요소가 하나 이상 있는 배열 요소만 프로젝션

배열과 서브 도큐먼트 쿼리

  • MQL에서 Dot notation을 사용하여 서브 도큐먼트의 요소 참조 가능
  • 배열에서 Dot notation을 사용하려면 요소의 위치를 지정해야 함
  • db.collection.find({“field 1.other field.also a field”:”value”})

Aggregation Framework

  • MQL보다 다양한 쿼리 작성 가능
  • 파이프라인의 각 단계 순서대로 데이터 처리. 이 안의 데이터는 원본데이터를 수정하거나 변경하지 않는다.
  • 각 단계의 이름 앞에는 $가 있고, 그 뒤에는 실행할 작업에 대한 설명이 나온다.

aggregate([{$stage1:{field:value}},{$stage2:{field:value}},...])

  • $match : 지정된 조건과 일치하는 문서만 다음 파이프라인 단계로 전달하도록 문서를 필터링한다.
  • $group : 지정된 _id표현식에 따라 입력 문서를 그룹화하고 개별 그룹화에 대해 문서를 출력한다. _id각 출력 문서 의 필드에는 값별로 고유한 그룹이 포함된다.
  • $project : 요청된 필드가 있는 문서를 파이프라인의 다음 단계로 전달한다. 지정된 필드는 입력 문서의 기존 필드 또는 새로 계산된 필드일 수 있다.

Index

몽고DB의 인덱스는 데이터를 탐색하기 쉬운 형태로 인덱스를 저장해야 하기 때문에 가나다순이 아닌 특수한 자료 구조로 나열되어 있다.

예를 들어 영유아의 정보를 저장하는 infantsInfo 콜렉션에서 키가 80cm인 영유아의 몸무게 정보를 오름차순으로 받아오고 싶다면

db.infantsInfo.find({"height"80}).sort("weight":1).pretty()
createIndex()

인덱스를 만들기 위해서 createIndex() 메소드 사용한다. 파라미터로 인덱스를 적용할 필드를 전달하고, 오름차순은 1, 내림차순은 -1로 지정한다. 필드명을 1개 지정하면 단일 필드 인덱스, 2개 이상이면 다중 인덱스.

db.collection_name.createIndex({<필드명>:1, <필드명>:-1})

createIndex()의 두번째 파라미터로 속성을 추가할 수 있다.

db.collection_name.createIndex({<필드명>:1}, {<속성 property>:true})
  • Unique(유일함 속성): _id 필드와 같이 컬렉션에 단 한개의 값만 존재할 수 있는 속성.
    db.members.createIndex( { "user_id": 1 }, { unique: true } )
    -- members라는 컬렉션의 각 도큐먼트에 존재하는 user_id 필드의 인덱스를 중복값 없는 유일한 필드로 생성
    
  • Partial(부분적 속성): 조건을 정해 일부 도큐먼트에만 인덱스 적용. 이를 위해 partialFilterExpression 옵션 사용.
    db.restauratns.createIndex({"cuisine":1, "name":1},  {partialFilterExpression:{ rating: {$gt:4}}})
    -- restaurants 라는 컬렉션에 cuisine, name 이라는 두 개의 필드를 사용하여 다중 인덱스 생성
    
  • TTL(Time-To-Live): Date 타입 혹은 Date 배열 타입의 필드에 적용 가능. 특정 시간이 지난 후, 도큐먼트를 컬렉션에서 삭제한다.
    db.eventlog.createIndex( { "lastModifiedDate": 1 }, { expireAfterSeconds: 3600 } )
    -- lastModifiedDate와 3600초 이상 차이가 나면 도큐먼트를 컬렉션에서 제거
    
getIndexes, dropIndex
  • 인덱스 확인 ```sql db.collection_name.getIndexes() /*
    • 인덱스를 생성하지 않았을 때는 _id값만 인덱스로 생성되어 있음 *[{
    • “v” : 2,
    • “key” : {
    • “_id” : 1
    • },
    • “name” : “id” *}] */ ```
  • 인덱스 삭제
    db.collection_name.dropIndex(name)
    // or
    db.collection_name.dropIndex({<field>:1})
    
    // 모든 인덱스 삭제
    db.collection_name.dropIndexes()