Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
Click here >
Docs Menu
Docs Home
/ /

희소 인덱스

MongoDB 의 희소 인덱스는 다른 데이터베이스의 블록 수준 희소 인덱스와 다릅니다. 희소 인덱스에는 인덱스 필드 필드 null 값이 포함되어 있더라도 인덱스 된 필드가 있는 문서에 대한 항목만 포함됩니다. 인덱스 인덱스된 필드 누락된 모든 문서 건너뜁니다. 인덱스 는 컬렉션 의 모든 문서를 포함하지 않기 때문에 'sparse'합니다. 반면 희소가 아닌 인덱스는 컬렉션 의 모든 문서를 포함하며, 인덱싱된 필드 포함하지 않는 문서에 대해서는 null 값을 저장합니다.

중요

부분 인덱스 는 희소 인덱스로 작동할 수 있지만 필드 존재 여부 이상의 조건에 대한 필터하다 표현식도 지원 . 정확한 필터링이 필요한 경우 부분 인덱스 사용하여 더 효과적으로 제어할 수 있습니다.

희소 인덱스를 만들려면 sparse 옵션을 true 로 설정한 상태에서 db.collection.createIndex() 메서드를 사용하십시오.

예를 들어 mongosh에서 다음 작업은 movies 컬렉션의 plot 필드에 희소 인덱스를 생성합니다.

db.movies.createIndex( { "plot": 1 }, { sparse: true } )

인덱스는 plot 필드를 포함하지 않는 문서의 인덱스를 생성하지 않습니다.

희소 인덱스 인해 쿼리 및 정렬 작업에 대한 불완전한 결과 설정하다 생성되는 경우, 가 hint() 인덱스 명시적으로 지정하지 않는 한 MongoDB 해당 인덱스 사용하지 않습니다. 예시 는 컬렉션의 희소 인덱스가 전체 결과를 반환할 수 없음을 참조하세요.

컬렉션의 모든 문서에 대해 count()(을)를 수행할 때 희소 인덱스를 지정하는 hint()(을)를 포함하면 (즉, 빈 쿼리 술어 사용), 희소 인덱스로 인해 잘못된 카운트가 발생하더라도 희소 인덱스가 사용됩니다.

예시 들어 movies 컬렉션 의 rated 필드 에 sparse index 만듭니다.

db.movies.createIndex( { rated: 1 }, { sparse: true } )

movies 컬렉션 의 문서 수를 계산하고 해당 희소 인덱스 지정하는 힌트를 포함하면 작업은 rated 필드 포함된 문서만 반환합니다.

db.movies.countDocuments( {}, { hint: { rated: 1 } } )

movies 컬렉션의 문서 수를 올바르게 계산하려면 컬렉션의 모든 문서 수를 계산할 때 hint() 을(를) sparse index 사용하여 사용하지 마세요.

db.movies.countDocuments()

다음 인덱스 유형은 항상 희소 설정을 갖습니다.

복합 인덱스에는 다양한 유형의 희소 인덱스가 포함될 수 있습니다. 인덱스 유형의 조합이 복합 인덱스가 문서를 어떻게 매칭하는지 결정합니다.

이 표에는 다양한 유형의 희소 인덱스가 포함된 복합 인덱스의 동작이 요약되어 있습니다.

복합 인덱스 구성 요소
컴파운드 인덱스 동작
Ascending indexes
Descending indexes

적어도 하나의 키에 대한 값을 포함하는 문서만 인덱싱합니다.

Ascending indexes
Descending indexes

문서에 geospatial 필드 중 하나에 대한 값이 포함된 경우에만 문서를 인덱싱합니다. 오름차순 또는 내림차순 인덱스의 문서는 인덱싱하지 않습니다.

Ascending indexes
Descending indexes

text 필드 중 하나와 일치하는 경우에만 문서의 인덱스를 생성합니다. 오름차순 또는 내림차순 인덱스의 문서를 인덱싱하지 않습니다.

희소성과 고유성을 모두 갖춘 인덱스는 컬렉션에서 중복된 필드 값을 가진 문서가 있는 것을 방지하지만 키를 생략한 여러 문서를 허용합니다.

다음 예시 password 필드 에 희소 인덱스 만듭니다.

db.users.createIndex( { password: 1 } , { sparse: true } )

그런 다음 users 컬렉션 에 대한 다음 쿼리 sparse index 사용하여 password 필드 있는 문서를 반환합니다.

db.users.find( { password: { $exists: true } } ).sort({ password: 1 }).limit(5)

문서 password 필드 포함되어 있지 않으면 쿼리 해당 문서 반환하지 않습니다.

일부 문서에 plot 필드 없는 movies 컬렉션 생각해 보세요.

다음 예시 plot 필드 에 희소 인덱스 만듭니다.

db.movies.createIndex( { "plot": 1 }, { sparse: true } )

movies 컬렉션의 모든 문서를 plot 필드로 정렬하여 반환하는 다음 쿼리를 고려해 보세요.

db.movies.find().sort( { plot: -1 } )

인덱싱된 필드 기준으로 정렬하더라도 movies 컬렉션의 일부 문서에 plot 필드 없는 경우 MongoDB는 완전한 결과를 반환하기 위해 쿼리 수행할 희소 인덱스를 선택하지 않습니다.

희소 인덱스를 사용하려면 hint()로 인덱스를 명시적으로 지정합니다.

db.movies.find().sort( { plot: -1 } ).hint( { plot: 1 } ).limit(5)

이 쿼리 plot 필드 포함된 movies 컬렉션 의 문서만 반환합니다.

다음 작업은 고유 제약 조건 및 희소 필터가 있는 인덱스를 userspassword 필드에 생성합니다.

db.users.createIndex( { password: 1 } , { sparse: true, unique: true } )

이 인덱스 사용하면 password 필드 에 대해 고유한 값을 가지거나 필드 포함하지 않는 문서를 삽입할 수 있습니다. 컬렉션 의 password 예시 문서의 users 경우 인덱스 다음과 같은 삽입 작업을 허용합니다.

db.users.insertMany( [
{ "name": "Jon Snow", "email": "jon@gameofthron.es", "password": "$2b$12$newHashedPassword1234567890ABC" },
{ "name": "Sansa Stark", "email": "sansa@gameofthron.es", "password": "$2b$12$anotherNewPassword1234567890DEF" },
{ "name": "Bran Stark", "email": "bran@gameofthron.es" }
] )

그러나 인덱스 는 컬렉션 에 이미 존재하는 이메일 주소가 있는 문서의 삽입을 허용하지 않습니다.

MongoDB 5.0부터는 동일한 키 패턴을 가진 고유한 희소 인덱스고유한 비희소 인덱스가 단일 컬렉션에 존재할 수 있습니다.

이 예시에서는 동일한 키 패턴과 다른 sparse 옵션을 사용하여 여러 인덱스를 만듭니다.

db.users.createIndex( { password : 1 }, { name: "unique_index", unique: true } )
db.users.createIndex( { password : 1 }, { name: "unique_sparse_index", unique: true, sparse: true } )

sparse 옵션을 사용하거나 사용하지 않고 동일한 키 패턴으로 기본 인덱스를 생성할 수도 있습니다.

db.users.createIndex( { password : 1 }, { name: "sparse_index", sparse: true } )
db.users.createIndex( { password : 1 }, { name: "basic_index" } )

돌아가기

부분

이 페이지의 내용