Поделиться через


Создание индексов подстановочных знаков в Azure Cosmos DB для виртуальных ядер MongoDB

Область применения: Виртуальные ядра MongoDB

Рабочие нагрузки с непредсказуемым набором полей в схеме могут использовать индексы подстановочных знаков для поддержки запросов к произвольным или неизвестным полям для оптимизации производительности.

Индексирование подстановочных знаков может оказаться полезным в следующих сценариях:

  • Запросы фильтрации по любому полю в документе, что делает индексирование всех полей с помощью одной команды проще, чем индексирование каждого поля по отдельности.
  • Запросы фильтрации по большинству полей в документе делают индексирование всех, кроме нескольких полей, проще, чем индексирование большинства полей по отдельности.

Индексирование всех полей

Настройте подстановочный индекс для упрощения запросов ко всем возможным полям документа, включая неизвестные или динамические имена.

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

Внимание

Для больших коллекций рекомендуется использовать альтернативный подход, определенный далее в этом документе.

Включение или исключение определенных полей

Индексы подстановочных знаков также могут быть ограничены определенными полями, исключая определенные поля из целевого объекта для индексирования. Давайте рассмотрим пример для следующего 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
                                                   }
                           }
                         )

В документе подстановочного знакаProjection значение 0 или 1 указывает, входит ли поле (1) или исключено (0) из индексирования.

Альтернатива индексации всех полей

В этом примере описывается простое решение, чтобы свести к минимуму усилия, необходимые для создания отдельных индексов, пока индексация подстановочных знаков не будет общедоступна в Azure Cosmos DB для виртуальных ядер MongoDB.

Рассмотрим приведенный ниже документ 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({"role.teamName", 1})
  • db.collection.createIndex({"role.teamSubName", 1})
  • db.collection.createIndex({"role.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 для MongoDB строка подключения с именем пользователя и паролем, используемым при подготовке кластера
  • База данных виртуальных ядер Azure Cosmos DB для MongoDB
  • Индексация коллекции
  • Расположение json-файла со структурой документа для коллекции. Этот документ анализируется jar-файлом для извлечения каждого поля и выдачи отдельных операций созданияIndex.
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. Индексы создаются асинхронно на сервере, а ход выполнения операции сборки индекса в кластере можно отслеживать.

Рассмотрим этот пример для отслеживания хода выполнения индексирования базы данных "космические работы".

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
}

Next Steps