Not
Åtkomst till denna sida kräver auktorisation. Du kan prova att logga in eller byta katalog.
Åtkomst till denna sida kräver auktorisation. Du kan prova att byta katalog.
Belastningar som har en oförutsägbar uppsättning fält i schemat kan använda index med jokertecken för att stödja frågeställningar mot godtyckliga eller okända fält för att optimera prestandan.
Wildcard-indexering kan vara användbar i följande scenarier:
- Frågor som filtrerar på valfritt fält i dokumentet, vilket gör indexering av alla fält via ett enda kommando enklare än att indexera varje fält individuellt.
- Frågor som filtrerar på de flesta fält i dokumentet gör indexering av alla utom ett fåtal fält via en enda enklare än att indexera de flesta fält individuellt.
Indexera alla fält
Konfigurera ett jokerteckenindex för att underlätta frågor om alla möjliga dokumentfält, inklusive de med okända eller dynamiska namn.
db.collection.createIndex( { "$**": 1 } )
Viktigt!
För stora samlingar rekommenderar vi att du använder en alternativ metod som definieras senare i det här dokumentet.
Inkludera eller exkludera specifika fält
Jokerteckenindex kan också begränsas till specifika fält samtidigt som vissa fält undantas från indexering. Nu ska vi granska ett exempel på följande json.
{
"firstName": "Steve",
"lastName": "Smith",
"companyName": "Microsoft",
"division": "Azure",
"timeInOrgInYears": 7
}
Vi kan styra indexeringsbeteendet. Exemplet begränsar skapandet av index i firstNamefältet ,lastName & timeInOrgInYears .
db.collection.createIndex( { "$**": 1 },
{"wildcardProjection" : { "firstName": 0
, "lastName": 0
, "companyName": 1
, "division": 1
, "timeInOrgInYears": 0
}
}
)
I dokumentet wildcardProjection anger värdet 0 eller 1 om fältet inkluderas (1) eller exkluderas (0) från indexering.
Alternativ för indexering av alla fält
Det här exemplet beskriver en enkel lösning för att minimera det arbete som krävs för att skapa enskilda index tills jokerteckenindexering är allmänt tillgängligt i Azure DocumentDB.
Överväg json-dokumentet nedan:
{
"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
}
]
}
Följande index skapas under täcket när jokerteckenindexering används.
- 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})
Även om det här exempeldokumentet bara kräver att en kombination av 10 fält uttryckligen indexeras, kan större dokument med hundratals eller tusentals fält bli omständliga och felbenägna vid indexering av fält individuellt.
Jar-filen som beskrivs i resten av det här dokumentet gör indexeringsfält i större dokument enklare. Jar-filen tar ett JSON-exempeldokument som indata, parsar dokumentet och kör createIndex-kommandon för varje fält utan att användaren behöver ingripa.
Förutsättningar
Java 21
När den virtuella datorn har distribuerats använder du SSH för att ansluta till datorn och installerar CQLSH med hjälp av kommandona nedan:
# Install default-jdk
sudo apt update
sudo apt install openjdk-21-jdk
Exempelburk för att skapa enskilda index för alla fält
Klona lagringsplatsen som innehåller Java-exemplet för att iterera genom varje fält i JSON-dokumentets struktur och utfärda createIndex-åtgärder för varje fält i dokumentet.
git clone https://github.com/Azure-Samples/cosmosdb-mongodb-vcore-wildcard-indexing.git
Den klonade lagringsplatsen behöver inte skapas om det inte finns några ändringar att göra i lösningen. Den inbyggda runnable jar med namnet azure-cosmosdb-mongo-data-indexer-1.0-SNAPSHOT.jar ingår redan i mappen runnableJar/. Jar-filen kan köras genom att ange följande obligatoriska parametrar:
- Anslutningssträng för Azure DocumentDB-kluster med användarnamnet och lösenordet som användes när klustret etablerades
- Azure DocumentDB-databasen
- Samlingen som ska indexeras
- Platsen för json-filen med dokumentstrukturen för samlingen. Det här dokumentet parsas av jar-filen för att extrahera varje fält och utfärda enskilda createIndex-åtgärder.
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
Spåra status för en createIndex-åtgärd
Jar-filen är utformad för att inte vänta på ett svar från varje createIndex-åtgärd. Indexen skapas asynkront på servern och förloppet för indexgenereringsåtgärden i klustret kan spåras.
Överväg det här exemplet för att spåra indexeringsstatusen i databasen "cosmicworks".
use cosmicworks;
db.currentOp()
När en createIndex-åtgärd pågår ser svaret ut så här:
{
"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
}
Nästa steg
- Se kodexempel – https://github.com/Azure-Samples/cosmosdb-mongodb-vcore-wildcard-indexing
- Granska här för indexering och begränsningar
- Lär dig mer om metodtips för indexering