MongoDB는 NoSQL이기 때문에 필드 구조가 일정하지 않을 수 있다.
그렇다면 인서트한 도큐먼트에 인덱스를 건 필드가 존재하지 않는다면 어떻게 처리될까?
아래 네 가지 경우 각각 어떻게 처리되는지 궁금했다.
// 1. 일반 인덱스
db.collection.createIndex({ "name": 1 })
// 2. 희소 인덱스
db.collection.createIndex({ "name": 1 }, { sparse: true })
// 3. 부분 인덱스
db.collection.createIndex({ "name": 1 },
{
partialFilterExpression: {
name: {$ne: null}
}
})
// 4. 유니크 인덱스
db.collection.createIndex({ "name": 1 }, {unique:true})
// 데이터 입력 예시
db.collection.insert({
"name": "다영",
"age": 11
})
// 이 상황!!! -> 여기서 어떻게 처리되지?
db.collection.insert({
"nickname": "dy",
"age": 13
})
db.collection.createIndex({ "name": 1 });
특징
빈 값 처리
db.collection.createIndex({ "name": 1 }, { sparse: true });
특징
빈 값 처리
특이사항
db.collection.createIndex({ "name": 1 }, { sparse: true });
db.collection.insert({ // name필드 저장 x -> sparse인덱스에 포함되지 않음
"nickname": "dy",
"age": 13
})
db.collection.insert({ // name필드 null로 저장 -> sparse인덱스에 포함됨
"name": null,
"age": 13
})
db.collection.find({ "name": null })
위 경우에는 어떻게 인덱스를 타지??
그렇다면 아예 Null인 데이터만 넣은 경우에는 인덱스를 타나?(필드 없는 경우 없이 모두 인덱스를 인서트한 경우)
db.collection.createIndex({ "name": 1 },
{
partialFilterExpression: {
name: {$ne: null}
}
});
빈 값 처리
db.collection.createIndex({ "name": 1 }, { unique: true });
빈 값 처리
name 필드가 없는 문서를 삽입할 때 첫 번째 문서의 경우 문제없이 저장되지만, 두 번째부터는 E11000 duplicate key error 오류가 발생
빈 값을 검색할 때는 인덱스를 사용함
| 인덱스 종류 | name 필드가 없는 문서 인덱스 포함 여부 | name:null 문서 인덱스 포함 여부 | 중복 null 허용 여부 | 빈 값 처리 결과 |
|---|---|---|---|---|
| 일반 인덱스 | 포함 | 포함 | 허용 | null로 인덱싱됨 |
| 희소 인덱스 | 미포함 | 포함 | 허용 | 인덱스 미포함 |
| 부분 인덱스 | 미포함(조건에 따라 다름) | 미포함(조건에 따라 다름) | 허용 | 인덱스 미포함 |
| 유니크 인덱스 | 포함(null로 취급) | 포함 | 미허용 | null 검색 시 인덱스 활용 |