다음을 통해 공유


Azure Cosmos DB for MongoDB vCore에서 와일드카드 인덱스 만들기

적용 대상: MongoDB vCore

스키마에 예측할 수 없는 필드 집합이 있는 워크로드는 와일드카드 인덱스를 사용하여 최적화된 성능을 위해 임의 또는 알 수 없는 필드에 대한 쿼리를 지원할 수 있습니다.

다음 시나리오에서 와일드카드 인덱싱은 유용할 수 있습니다.

  • 문서의 모든 필드에 대한 쿼리 필터링을 통해 각 필드를 개별적으로 인덱싱하는 것보다 단일 명령을 통해 모든 필드를 인덱싱하는 것이 더 쉽습니다.
  • 문서의 대부분의 필드를 필터링하여 대부분의 필드를 개별적으로 인덱싱하는 것보다 단일 필드를 통해 몇 개의 필드를 제외한 모든 필드를 인덱싱하는 것이 더 쉽습니다.

모든 필드 인덱싱

알 수 없거나 동적 이름을 가진 필드를 포함하여 가능한 모든 문서 필드에 대한 쿼리를 용이하게 하려면 와일드카드 인덱스를 설정합니다.

db.collection.createIndex( { "$**": 1 } )

Important

큰 컬렉션의 경우 이 문서의 뒷부분에 정의된 대체 방법을 사용하는 것이 좋습니다.

특정 필드 포함 또는 제외

와일드카드 인덱스는 특정 필드로 제한할 수도 있지만 특정 필드를 인덱싱 대상으로 지정하지 않을 수도 있습니다. 다음 Json에 대한 샘플을 검토해 보겠습니다.

{
    "firstName": "Steve",
    "lastName": "Smith",
    "companyName": "Microsoft",
    "division": "Azure",
    "timeInOrgInYears": 7
}

우리는 인덱싱 동작을 제어 할 수 있으며, 예제는 firstName, lastName, timeInOrgInYears 필드에 인덱스 생성을 제한합니다.

db.collection.createIndex( { "$**": 1 },
                           {"wildcardProjection" : {  "firstName": 0
                                                    , "lastName": 0
                                                    , "companyName": 1
                                                    , "division": 1
                                                    , "timeInOrgInYears": 0
                                                   }
                           }
                         )

와일드카드 프로젝션 문서에서 값 0 또는 1은 필드가 인덱싱에서 포함(1) 또는 제외(0)되는지 여부를 나타냅니다.

모든 필드 인덱싱을 위한 대안

이 샘플에서는 Azure Cosmos DB for MongoDB vCore에서 와일드카드 인덱싱을 일반적으로 사용할 수 있을 때까지 개별 인덱스를 만드는 데 필요한 활동을 최소화하는 단순한 해결 방법을 설명합니다.

아래 json 문서를 사용하는 것이 좋습니다.

{
    "firstName": "Steve",
    "lastName": "Smith",
    "companyName": "Microsoft",
    "division": "Azure",
    "subDivision": "Data & AI",
    "timeInOrgInYears": 7,
    "roles": [
        {
            "teamName" : "Windows",
            "teamSubName" "Operating Systems",
            "timeInTeamInYears": 3
        },
        {
            "teamName" : "Devices",
            "teamSubName" "Surface",
            "timeInTeamInYears": 2
        },
        {
            "teamName" : "Devices",
            "teamSubName" "Surface",
            "timeInTeamInYears": 2
        }
    ]
}

와일드카드 인덱싱을 사용하면 내부적으로 다음 인덱스가 만들어집니다.

  • db.collection.createIndex({"firstName", 1})
  • db.collection.createIndex({"lastName", 1})
  • db.collection.createIndex({"companyName", 1})
  • db.collection.createIndex({"division", 1})
  • db.collection.createIndex({"subDivision", 1})
  • db.collection.createIndex({"timeInOrgInYears", 1})
  • db.collection.createIndex({"subDivision", 1})
  • db.collection.createIndex({"roles.teamName", 1})
  • db.collection.createIndex({"roles.teamSubName", 1})
  • db.collection.createIndex({"roles.timeInTeamInYears", 1})

이 샘플 문서에서는 명시적으로 인덱싱하기 위해 10개의 필드 조합만 필요하지만, 수백 또는 수천 개의 필드가 있는 대규모 문서의 필드를 개별적으로 인덱싱하는 작업은 지루하게 진행되며 오류가 발생하기 쉽습니다.

이 문서의 나머지 부분에 자세히 설명된 jar 파일을 사용하면 더 큰 문서의 필드 인덱싱이 더 단순해집니다. jar는 샘플 JSON 문서를 입력으로 사용하여 문서를 구문 분석하고 사용자 개입 없이 각 필드에 대해 createIndex 명령을 실행합니다.

필수 조건

Java 21

가상 머신이 배포되면 SSH를 사용하여 해당 머신에 연결하고 아래 명령을 사용하여 CQLSH를 설치합니다.

# Install default-jdk
sudo apt update
sudo apt install openjdk-21-jdk

모든 필드에 대한 개별 인덱스를 만드는 샘플 jar

Java 샘플이 포함된 리포지토리를 복제하여 JSON 문서 구조의 각 필드를 반복하고 문서의 각 필드에 대해 createIndex 작업을 실행합니다.

git clone https://github.com/Azure-Samples/cosmosdb-mongodb-vcore-wildcard-indexing.git

솔루션에 변경 내용이 없으면 복제된 리포지토리를 빌드할 필요가 없습니다. 빌드된 실행 가능 jar(azure-cosmosdb-mongo-data-indexer-1.0-SNAPSHOT.jar) 파일은 이미 runnableJar/ 폴더에 포함되어 있습니다. jar는 다음 필수 매개 변수를 지정하여 실행할 수 있습니다.

  • 클러스터가 프로비전될 때 사용된 사용자 이름 및 암호가 포함된 Azure Cosmos DB for MongoDB vCore 리소스 연결 문자열
  • Azure Cosmos DB for MongoDB vCore 리소스 vCore 데이터베이스
  • 인덱싱할 컬렉션
  • 컬렉션의 문서 구조가 포함된 json 파일의 위치입니다. 이 문서는 jar 파일로 구문 분석되어 모든 필드를 추출하고 개별 createIndex 작업을 실행합니다.
java -jar azure-cosmosdb-mongo-data-indexer-1.0-SNAPSHOT.jar mongodb+srv://<user>:<password>@abinav-test-benchmarking.global.mongocluster.cosmos.azure.com/?tls=true&authMechanism=SCRAM-SHA-256&retrywrites=false&maxIdleTimeMS=120000 cosmicworks employee sampleEmployee.json

createIndex 작업 상태 추적

jar 파일은 각 createIndex 작업의 응답을 기다리지 않도록 설계되었습니다. 인덱스는 서버에서 비동기식으로 만들어지며 클러스터에서 인덱스 빌드 작업의 진행률을 추적할 수 있습니다.

'cosmicworks' 데이터베이스의 인덱싱 진행률을 추적하려면 이 샘플을 사용하는 것이 좋습니다.

use cosmicworks;
db.currentOp()

createIndex 작업이 진행 중일 때 응답은 다음과 같습니다.

{
  "inprog": [
    {
      "shard": "defaultShard",
      "active": true,
      "type": "op",
      "opid": "30000451493:1719209762286363",
      "op_prefix": 30000451493,
      "currentOpTime": "2024-06-24T06:16:02.000Z",
      "secs_running": 0,
      "command": { "aggregate": "" },
      "op": "command",
      "waitingForLock": false
    },
    {
      "shard": "defaultShard",
      "active": true,
      "type": "op",
      "opid": "30000451876:1719209638351743",
      "op_prefix": 30000451876,
      "currentOpTime": "2024-06-24T06:13:58.000Z",
      "secs_running": 124,
      "command": { "createIndexes": "" },
      "op": "workerCommand",
      "waitingForLock": false,
      "progress": {},
      "msg": ""
    }
  ],
  "ok": 1
}

다음 단계