수색…
통사론
db.collection.createIndex({ <string field> : <1|-1 order> [, <string field> : <1|-1 order>] });
비고
성능 영향 : 인덱스를 사용하면 읽기 성능이 향상되지만, 문서를 삽입 할 때 모든 인덱스를 업데이트해야하므로 쓰기 성능에 나쁜 영향을 미칠 수 있습니다.
단일 입력란
db.people.createIndex({name: 1})
필드 이름 에 오름차순 단일 필드 인덱스가 만들어집니다.
이러한 유형의 인덱스에서는 mongo가 인덱스를 두 방향으로 이동할 수 있기 때문에 정렬 순서가 중요하지 않습니다.
화합물
db.people.createIndex({name: 1, age: -1})
이렇게하면 여러 필드,이 경우 name
및 age
필드에 대한 색인이 작성됩니다. name
이 오름차순이고 age
내림차순입니다.
이 인덱스 유형에서 정렬 순서는 인덱스가 정렬 작업을 지원할 수 있는지 여부를 결정할 것이므로 관련이 있습니다. 역 정렬은 복합 색인의 모든 접두사에서 지원되며, 정렬이 정렬의 모든 키에 대해 역순 정렬 방향에있는 한 지원됩니다. 그렇지 않으면 복합 색인을 정렬하는 것이 색인의 순서와 일치해야합니다.
필드 순서도 중요합니다.이 경우 색인은 name
으로 먼저 정렬되고 각 이름 값 내에서 age
필드의 값에 따라 정렬됩니다. 이렇게하면 name
필드 나 name
과 age
에 대한 쿼리에서 인덱스를 사용할 수 있지만 age
만으로는 사용할 수 없습니다.
지우다
색인을 삭제하려면 색인 이름을 사용할 수 있습니다.
db.people.dropIndex("nameIndex")
또는 색인 명세 문서
db.people.dropIndex({name: 1})
명부
db.people.getIndexes()
이는 사람들 컬렉션에 대한 인덱스를 각각 기술하는 문서 배열을 반환합니다.
색인 생성 기본 사항
아래 거래 컬렉션을 참조하십시오.
> db.transactions.insert({ cr_dr : "D", amount : 100, fee : 2});
> db.transactions.insert({ cr_dr : "C", amount : 100, fee : 2});
> db.transactions.insert({ cr_dr : "C", amount : 10, fee : 2});
> db.transactions.insert({ cr_dr : "D", amount : 100, fee : 4});
> db.transactions.insert({ cr_dr : "D", amount : 10, fee : 2});
> db.transactions.insert({ cr_dr : "C", amount : 10, fee : 4});
> db.transactions.insert({ cr_dr : "D", amount : 100, fee : 2});
getIndexes()
함수는 컬렉션에 사용할 수있는 모든 인덱스를 표시합니다.
db.transactions.getIndexes();
위의 진술을 보자.
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "documentation_db.transactions"
}
]
트랜잭션 수집에는 이미 하나의 인덱스가 있습니다. 이는 MongoDB가 콜렉션을 생성하는 동안 _id
필드에 고유 인덱스 를 작성하기 때문입니다. _id
인덱스는 클라이언트가 _id
필드에 대해 동일한 값을 갖는 두 개의 문서를 삽입하는 것을 방지합니다. 이 색인은 _id
필드에 놓을 수 없습니다.
이제 cr_dr 필드에 대한 색인을 추가해 보겠습니다.
db.transactions.createIndex({ cr_dr : 1 });
인덱스 실행 결과는 다음과 같습니다.
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
createdCollection은 작업에서 컬렉션이 만들어 졌는지 여부를 자동으로 나타냅니다. 컬렉션이 존재하지 않으면 MongoDB는 인덱스 작업의 일부로 컬렉션을 생성합니다.
db.transactions.getIndexes();
실행 db.transactions.getIndexes();
다시.
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "documentation_db.transactions"
},
{
"v" : 1,
"key" : {
"cr_dr" : 1
},
"name" : "cr_dr_1",
"ns" : "documentation_db.transactions"
}
]
이제 트랜잭션 콜렉션에는 두 개의 인덱스가 있음을 알 수 있습니다. 우리가 만든 기본 _id
인덱스와 cr_dr_1
. 이름은 MongoDB에 의해 지정됩니다. 아래와 같이 자신의 이름을 설정할 수 있습니다.
db.transactions.createIndex({ cr_dr : -1 },{name : "index on cr_dr desc"})
이제 db.transactions.getIndexes();
세 가지 지표를 줄 것이다.
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "documentation_db.transactions"
},
{
"v" : 1,
"key" : {
"cr_dr" : 1
},
"name" : "cr_dr_1",
"ns" : "documentation_db.transactions"
},
{
"v" : 1,
"key" : {
"cr_dr" : -1
},
"name" : "index on cr_dr desc",
"ns" : "documentation_db.transactions"
}
]
인덱스 { cr_dr : -1 }
만드는 동안 인덱스는 ascending
, descending
-1을 의미합니다.
해시 된 색인
인덱스는 해쉬 로 정의 될 수도 있습니다. 이것은 평등 쿼리 에서 더 우수하지만 범위 쿼리 에는 효율적이지 않습니다. 그러나 동일한 필드에 해시 된 인덱스와 오름차순 / 내림차순 인덱스를 모두 정의 할 수 있습니다.
> db.transactions.createIndex({ cr_dr : "hashed" });
> db.transactions.getIndexes(
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "documentation_db.transactions"
},
{
"v" : 1,
"key" : {
"cr_dr" : "hashed"
},
"name" : "cr_dr_hashed",
"ns" : "documentation_db.transactions"
}
]
색인 삭제 / 삭제
색인 이름이 알려진 경우,
db.collection.dropIndex('name_of_index');
색인 이름을 알 수없는 경우,
db.collection.dropIndex( { 'name_of_field' : -1 } );
컬렉션의 인덱스 가져 오기
db.collection.getIndexes();
산출
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "documentation_db.transactions"
},
{
"v" : 1,
"key" : {
"cr_dr" : 1
},
"name" : "cr_dr_1",
"ns" : "documentation_db.transactions"
},
{
"v" : 1,
"key" : {
"cr_dr" : -1
},
"name" : "index on cr_dr desc",
"ns" : "documentation_db.transactions"
}
]
고유 색인
db.collection.createIndex( { "user_id": 1 }, { unique: true } )
정의 된 색인 (단일 또는 복합)에 대해 고유성을 강요합니다. 컬렉션에 이미 중복 값이 포함되어 있으면 인덱스 작성이 실패합니다. sparse: true
가 지정되어 있지 않으면 여러 항목에 필드가 누락 되어도 색인 생성이 실패합니다 (모두 null
값으로 색인화되기 때문에).
스파 스 인덱스 및 부분 인덱스
스파 스 색인 :
선택 사항이지만 고유해야하는 필드에 특히 유용 할 수 있습니다.
{ "_id" : "[email protected]", "nickname" : "Johnnie" }
{ "_id" : "[email protected]" }
{ "_id" : "[email protected]", "nickname" : "Jules"}
{ "_id" : "[email protected]" }
두 개의 엔트리는 "닉네임"이 지정되지 않았고 인덱싱은 지정되지 않은 필드를 null로 처리하므로 'null'을 갖는 두 개의 문서로 인덱스 생성이 실패합니다.
db.scores.createIndex( { nickname: 1 } , { unique: true, sparse: true } )
너는 여전히 'null'별명을 가지게 할 것이다.
스파 스 인덱스는 해당 필드를 지정하지 않은 문서를 건너 뛰거나 무시하므로 더욱 간단합니다. 따라서 문서의 10 % 미만 만이 필드를 지정하는 모음이있는 경우 매우 작은 색인을 만들 수 있습니다. 다음과 같은 쿼리를 수행하려는 경우 제한된 메모리를 더 잘 사용할 수 있습니다.
db.scores.find({'nickname': 'Johnnie'})
부분 색인 :
부분 인덱스는 스파 스 인덱스에서 제공하는 기능의 수퍼 세트를 나타내며 스파 스 인덱스보다 우선해야합니다. ( 버전 3.2의 새로운 기능 )
부분 인덱스는 지정된 필터를 기반으로 인덱스 항목을 결정합니다.
db.restaurants.createIndex(
{ cuisine: 1 },
{ partialFilterExpression: { rating: { $gt: 5 } } }
)
rating
이 5보다 크면 cuisine
가 색인됩니다. 예. 다른 속성의 값을 기준으로 색인 생성 할 속성을 지정할 수도 있습니다.
스파 스 인덱스와 부분 인덱스의 차이점 :
스파 스 색인은 색인화 된 필드의 존재 여부 또는 복합 색인의 경우 색인화 된 필드의 존재 여부에 따라 단독으로 색인 할 문서를 선택합니다.
부분 인덱스는 지정된 필터를 기반으로 인덱스 항목을 결정합니다. 필터에는 색인 키 이외의 필드가 포함될 수 있으며 존재 확인 이외의 조건을 지정할 수 있습니다.
여전히 부분 인덱스는 스파 스 인덱스와 동일한 동작을 구현할 수 있습니다.
예 :
db.contacts.createIndex(
{ name: 1 },
{ partialFilterExpression: { name: { $exists: true } } }
)
주 : partialFilterExpression 옵션과 스파 스 옵션은 동시에 지정할 수 없습니다.