수색…


통사론

  • 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})

이렇게하면 여러 필드,이 경우 nameage 필드에 대한 색인이 작성됩니다. name 이 오름차순이고 age 내림차순입니다.

이 인덱스 유형에서 정렬 순서는 인덱스가 정렬 작업을 지원할 수 있는지 여부를 결정할 것이므로 관련이 있습니다. 역 정렬은 복합 색인의 모든 접두사에서 지원되며, 정렬이 정렬의 모든 키에 대해 역순 정렬 방향에있는 한 지원됩니다. 그렇지 않으면 복합 색인을 정렬하는 것이 색인의 순서와 일치해야합니다.

필드 순서도 중요합니다.이 경우 색인은 name 으로 먼저 정렬되고 각 이름 값 내에서 age 필드의 값에 따라 정렬됩니다. 이렇게하면 name 필드 나 nameage 에 대한 쿼리에서 인덱스를 사용할 수 있지만 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을 의미합니다.

2.4

해시 된 색인

인덱스는 해쉬 로 정의 될 수도 있습니다. 이것은 평등 쿼리 에서 더 우수하지만 범위 쿼리 에는 효율적이지 않습니다. 그러나 동일한 필드에 해시 된 인덱스와 오름차순 / 내림차순 인덱스를 모두 정의 할 수 있습니다.

> 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 옵션과 스파 스 옵션은 동시에 지정할 수 없습니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow