Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Область применения:
Виртуальные ядра 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
}
}
)
В документе wildcardProjection значение 0 или 1 указывает, включено (1) или исключено (0) поле из индексирования.
Альтернатива индексации всех полей
В этом примере описывается простое решение для сведения к минимуму усилий, необходимых для создания отдельных индексов, до тех пор, пока индексация через подстановочные знаки не станет общедоступной в Azure Cosmos DB для vCore 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({"roles.teamName", 1})
- db.collection.createIndex({"role.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 vCore для MongoDB, используя имя пользователя и пароль, примененные при предоставлении кластера.
- База данных виртуальных ядер Azure Cosmos DB для MongoDB
- Индексация коллекции
- Расположение 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. Индексы создаются асинхронно на сервере, а ход выполнения операции сборки индекса в кластере можно отслеживать.
Рассмотрим этот пример для отслеживания хода выполнения индексирования базы данных "космические работы".
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
}
Следующие шаги
- См. пример кода: https://github.com/Azure-Samples/cosmosdb-mongodb-vcore-wildcard-indexing
- Просмотрите раздел Индексация и ограничения
- Узнайте о рекомендациях по индексированию