Vytváření indexů se zástupnými čarami ve službě Azure Cosmos DB pro virtuální jádro MongoDB
PLATÍ PRO: Virtuální jádro MongoDB
Úlohy, které mají nepředvídatelnou sadu polí ve schématu, můžou k podpoře dotazů na libovolná nebo neznámá pole použít indexy se zástupnými znamény pro optimalizovaný výkon.
Indexování zástupných znaků může být užitečné v následujících scénářích:
- Dotazy filtrující podle libovolného pole v dokumentu usnadňují indexování všech polí prostřednictvím jediného příkazu než indexování jednotlivých polí.
- Dotazy filtrující většinu polí v dokumentu, které indexují všechna pole kromě několika polí, je jednodušší než indexování většiny polí jednotlivě.
Indexování všech polí
Nastavte index se zástupnými znamény pro usnadnění dotazů na všechna možná pole dokumentu, včetně těch s neznámými nebo dynamickými názvy.
db.collection.createIndex( { "$**": 1 } )
Důležité
U velkých kolekcí doporučujeme použít alternativní přístup definovaný později v tomto dokumentu.
Zahrnutí nebo vyloučení konkrétních polí
Indexy se zástupnými výjimkou můžou být také omezeny na konkrétní pole a zároveň vyloučit určitá pole z cílených na indexování. Pojďme se podívat na ukázku pro následující json.
{
"firstName": "Steve",
"lastName": "Smith",
"companyName": "Microsoft",
"division": "Azure",
"timeInOrgInYears": 7
}
Můžeme řídit chování indexování, příklad omezuje vytváření indexů pro firstName
pole alastName
timeInOrgInYears
pole.
db.collection.createIndex( { "$**": 1 },
{"wildcardProjection" : { "firstName": 0
, "lastName": 0
, "companyName": 1
, "division": 1
, "timeInOrgInYears": 0
}
}
)
V dokumentu wildcardProjection hodnota 0 nebo 1 označuje, zda je pole zahrnuto (1) nebo vyloučeno (0) z indexování.
Alternativa pro indexování všech polí
Tato ukázka popisuje jednoduché alternativní řešení pro minimalizaci úsilí potřebného k vytvoření jednotlivých indexů, dokud nebude indexování zástupných znaků obecně dostupné ve službě Azure Cosmos DB pro virtuální jádro MongoDB.
Podívejte se na následující dokument 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
}
]
}
Následující indexy jsou vytvořeny pod kryty při použití indexování zástupných znaků.
- 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})
I když tento ukázkový dokument vyžaduje explicitní indexování kombinace 10 polí, větší dokumenty se stovkami nebo tisíci polí můžou být při indexování polí zdlouhavé a náchylné k chybám.
Soubor JAR podrobně popsaný ve zbývající části tohoto dokumentu usnadňuje indexování polí ve větších dokumentech. Soubor JAR vezme ukázkový dokument JSON jako vstup, parsuje dokument a spustí příkazy createIndex pro každé pole bez nutnosti zásahu uživatele.
Požadavky
Java 21
Po nasazení virtuálního počítače se pomocí SSH připojte k počítači a pomocí následujících příkazů nainstalujte CQLSH:
# Install default-jdk
sudo apt update
sudo apt install openjdk-21-jdk
Ukázkový soubor JAR pro vytvoření jednotlivých indexů pro všechna pole
Naklonujte úložiště obsahující ukázku Javy, abyste iteraci prošli jednotlivými poli ve struktuře dokumentu JSON a vydali operace createIndex pro každé pole v dokumentu.
git clone https://github.com/Azure-Samples/cosmosdb-mongodb-vcore-wildcard-indexing.git
Klonované úložiště nemusí být sestaveno, pokud se v řešení neprovedou žádné změny. Integrovaný spustitelný soubor JAR s názvem azure-cosmosdb-mongo-data-indexer-1.0-SNAPSHOT.jar je již součástí složky runnableJar/. Soubor JAR lze spustit zadáním následujících požadovaných parametrů:
- Cluster azure Cosmos DB pro virtuální jádra MongoDB připojovací řetězec s uživatelským jménem a heslem použitým při zřízení clusteru
- Databáze virtuálních jader Azure Cosmos DB pro MongoDB
- Kolekce, která se má indexovat
- Umístění souboru JSON se strukturou dokumentu pro kolekci. Tento dokument je analyzován souborem JAR za účelem extrahování všech polí a vydávání jednotlivých operací 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
Sledování stavu operace createIndex
Soubor JAR je navržený tak, aby nečeká na odpověď z každé operace createIndex. Indexy se vytvářejí asynchronně na serveru a průběh operace sestavení indexu v clusteru je možné sledovat.
Tuto ukázku zvažte ke sledování průběhu indexování v databázi "vesmírných děl".
use cosmicworks;
db.currentOp()
Když probíhá operace createIndex, odpověď vypadá takto:
{
"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
}
Další kroky
- Projděte si ukázku kódu – https://github.com/Azure-Samples/cosmosdb-mongodb-vcore-wildcard-indexing
- Tady najdete informace o indexování a omezeních.
- Informace o osvědčených postupech indexování