TTL Index: 시간을 기준으로 자동으로 생성된 도큐먼트를 삭제한다. 날짜를 기준으로 하는, 또는 날짜를 가지고 있는 배열을 포함하는 싱글필드 인덱스만 생성 가능하다.


테스트 데이터 생성 -> 인덱스 적용(60초 후 삭제) -> 데이터 검색(삭제되어 검색되지 않음)
Unique Index: 중복된 값을 허용하지 않는다 (_id에는 기본적으로 적용된며 이미 중복된 데이터에는 생성할 수 없다)

name 필드에 유니크 인덱스 생성 -> 데이터 삽입(tom,john) -> 데이터 삽입(tom) -> 유니크 인덱스 오류 발생
Unique Index + Compound Index

name + age에 인덱스 생성 -> 데이터 생성(james,23) -> 데이터 생성(james,24) -> 정상 실행
Sparse Index: 필드가 존재한 경우에만 인덱스를 설정한다.

데이터 생성(x:1,x:2,y:1) -> x에 관한 인덱스 생성 -> x에 관한 데이터 조회
(기본 find옵션을 주면 생성했던 데이터가 전부 출력 되지만, hint({x:1})을 주면 x에 관한 데이터만 출력된다)
Sparse + PartialFilterExpression: 조건에 도큐먼트에 대해서만 인덱싱함

데이터생성(x가 존재하고, x가 2보다 커야함) -> 데이터 조회
Hidden Index: query planner로 부터 인덱스를 숨겨 해당 인덱스를 사용하지 못하게 함.
(인덱스를 삭제하기 전, Hidden Index로 미리 테스트 할 수 있다)
// 쿼리플랜으로 해당인덱스를 사용하지 못하도록 숨김
// 운영중인 서비스에서 특정 인덱스를 드랍하고 싶다 -> 예상치못한 이슈 발생할 수 있음 -> 히든으로 처리 한 후 테스트 진행 -> 삭제
// 삭제하기전 테스트하기 용이함
db.hidden.insertOne({ a: 1 })
db.hidden.insertOne({ a: 2 })
db.hidden.createIndex(
{ a: 1 },
{hidden: true}
)
/**
* a:1 hidden 되었기 때문에 COLLSCAN으로 작동한다.
* executionStages: {
stage: 'COLLSCAN',
filter: { a: { '$eq': 1 } },
nReturned: 1,
executionTimeMillisEstimate: 0,
works: 3,
advanced: 1,
needTime: 1,
needYield: 0,
saveState: 0,
restoreState: 0,
isEOF: 1,
direction: 'forward',
docsExamined: 2
}
},
command: { find: 'hidden', filter: { a: 1 }, '$db': 'test' },
*/
db.hidden.find(
{a: 1}
).explain('executionStats')
// 권한이 없으면 해제할 수 없다는 오류
// MongoServerError[AtlasError]: user is not allowed to do action [collMod] on [test.hidden]
// 아틀라스에서 유저에게 권한을 부여해야 함
db.hidden.unhideIndex({ a: 1 })
/**
* hidden이 해제되어 IXSCAN로 작동함
* executionStages: {
stage: 'FETCH',
nReturned: 1,
executionTimeMillisEstimate: 0,
works: 2,
advanced: 1,
needTime: 0,
needYield: 0,
saveState: 0,
restoreState: 0,
isEOF: 1,
docsExamined: 1,
alreadyHasObj: 0,
inputStage: {
stage: 'IXSCAN',
nReturned: 1,
executionTimeMillisEstimate: 0,
works: 2,
advanced: 1,
needTime: 0,
needYield: 0,
saveState: 0,
restoreState: 0,
isEOF: 1,
keyPattern: { a: 1 },
indexName: 'a_1',
isMultiKey: false,
multiKeyPaths: { a: [] },
isUnique: false,
isSparse: false,
isPartial: false,
indexVersion: 2,
direction: 'forward',
indexBounds: { a: [ '[1, 1]' ] },
keysExamined: 1,
seeks: 1,
dupsTested: 0,
dupsDropped: 0
}
}
},
command: { find: 'hidden', filter: { a: 1 }, '$db': 'test' },
*/
db.hidden.find(
{a: 1}
).explain('executionStats')