Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Indizes sind Strukturen, die die Datenempfangsgeschwindigkeit verbessern, indem der schnelle Zugriff auf bestimmte Felder innerhalb einer Auflistung ermöglicht wird. In diesem Artikel wird erläutert, wie Sie die Indizierung auf verschiedenen Schachtelungsebenen durchführen und überprüfen, wie Sie die Nutzung dieser Indizes effektiv überprüfen.
Indizierungsszenarien
Wir würden an Beispielszenarien mit Kontext zum definierten Beispiel-JSON arbeiten.
{
"_id": "e79b564e-48b1-4f75-990f-e62de2449239",
"car_id":"AZ-9874532",
"car_info": {
"make": "Mustang",
"model": "GT Fastback",
"year": 2024,
"registration": {
"license_plate": "LJX386",
"state": "WV",
"registration_datetime": {
"$date": "2024-01-10T01:16:44.000Z"
},
"expiration_datetime": {
"$date": "2034-01-10T01:16:44.000Z"
}
}
},
"rental_history": [
{
"rental_id": "RT63857499825952",
"customer_id": "CX8716",
"start_date": {
"$date": "2024-02-29T01:16:44.000Z"
},
"end_date": {
"$date": "2024-03-04T16:54:44.000Z"
},
"pickup_location": { "type": "Point", "coordinates": [ -73.97, 40.77 ]
},
"drop_location": { "type": "Point", "coordinates": [ -73.96, 40.78 ]
},
"total_price": 232.56944444444443,
"daily_rent": 50,
"complains": [
{
"complain_id": "CMP638574998259520",
"issue": "Strange odor inside the car.",
"reported_datetime": {
"$date": "2024-03-03T20:11:44.000Z"
},
"reported_medium": "Website",
"resolutions": [
{
"resolution_datetime": {
"$date": "2024-03-03T20:20:44.000Z"
},
"solution": "Inspect for any leftover food, spills, or trash that might be causing the odor. Contact the rental agency.",
"resolved": true
}
]
}
],
"accidents": [
{
"accident_id": "ACC376184",
"date": {
"$date": "2024-03-03T01:47:44.000Z"
},
"description": "Collisions with Soft Barriers: Accidents involving hitting bushes, shrubs, or other soft barriers.",
"repair_cost": 147
}
]
},
{
"rental_id": "RT63857499825954",
"customer_id": "CX1412",
"start_date": {
"$date": "2033-11-18T01:16:44.000Z"
},
"end_date": {
"$date": "2033-11-25T21:11:44.000Z"
},
"pickup_location": { "type": "Point", "coordinates": [ 40, 5 ]
},
"drop_location": { "type": "Point", "coordinates": [ 41, 11 ]
},
"total_price": 305.3645833333333,
"daily_rent": 39,
"complains": [
{
"complain_id": "CMP638574998259540",
"issue": "Unresponsive infotainment system.",
"reported_datetime": {
"$date": "2033-11-19T17:55:44.000Z"
},
"reported_medium": "Agency",
"resolutions": []
}
],
"accidents": null
}
],
"junk": null
}
Indizieren des Stammfelds
Azure DocumentDB ermöglicht Indizes für Stammeigenschaften. Das Beispiel ermöglicht die Suche nach car_id über sampleColl.
CarData> db.sampleColl.createIndex({"car_id":1})
Der Ausführungsplan ermöglicht die Überprüfung der Verwendung des erstellten Index auf dem Feld car_id mit explain.
CarData> db.sampleColl.find({"car_id":"ZA-XWB804"}).explain()
{
explainVersion: 2,
command: "db.runCommand({explain: { 'find' : 'sampleColl', 'filter' : { 'car_id' : 'ZA-XWB804' } }})",
explainCommandPlanningTimeMillis: 0.156,
explainCommandExecTimeMillis: 37.956,
dataSize: '32 kB',
queryPlanner: {
namespace: 'CarData.sampleColl',
winningPlan: {
stage: 'FETCH',
estimatedTotalKeysExamined: 8700,
inputStage: {
stage: 'IXSCAN',
indexName: 'car_id_1',
isBitmap: true,
indexFilterSet: [ { '$eq': { car_id: 'ZA-XWB804' } } ],
estimatedTotalKeysExamined: 174
}
}
},
ok: 1
}
Indizieren der geschachtelten Eigenschaften
Azure DocumentDB ermöglicht das Indizieren eingebetteter Dokumenteigenschaften. Im Beispiel wird ein Index für das Feld registration_datetime in einem geschachtelten Dokument registrationerstellt.
CarData> db.sampleColl.createIndex({"car_info.registration.registration_datetime":1})
Überprüfen Sie den Ausführungsplan mit explain, bietet Einblicke in die Indexüberprüfung.
CarData> db.sampleColl.find({"car_info.registration.registration_datetime":
{ $gte : new ISODate("2024-05-01")
,$lt: ISODate("2024-05-07")
}
}).explain()
{
explainVersion: 2,
command: "db.runCommand({explain: { 'find' : 'sampleColl', 'filter' : { 'car_info.registration.registration_datetime' : { '$gte' : ISODate('2024-05-01T00:00:00Z'), '$lt' : ISODate('2024-05-07T00:00:00Z') } } }})",
explainCommandPlanningTimeMillis: 0.095,
explainCommandExecTimeMillis: 42.703,
dataSize: '4087 kB',
queryPlanner: {
namespace: 'CarData.sampleColl',
winningPlan: {
stage: 'FETCH',
estimatedTotalKeysExamined: 4350,
inputStage: {
stage: 'IXSCAN',
indexName: 'car_info.registration.registration_datetime_1',
isBitmap: true,
indexFilterSet: [
{
'$range': {
'car_info.registration.registration_datetime': {
min: ISODate("2024-05-01T00:00:00.000Z"),
max: ISODate("2024-05-07T00:00:00.000Z"),
minInclusive: true,
maxInclusive: false
}
}
}
],
estimatedTotalKeysExamined: 2
}
}
},
ok: 1
}
Indizieren der Arrays an der Wurzel
Azure DocumentDB ermöglicht die Indizierung der Stammeigenschaft, die als Array definiert ist. Betrachten wir das folgende JSON-Beispiel.
{
"_id": ObjectId("58f56170ee9d4bd5e610d644"),
"id": 1,
"num": 001,
"name": "Bulbasaur",
"img": "http://www.serebii.net/pokemongo/pokemon/001.png",
"type": [ 'Grass', 'Poison' ],
"height": '0.71 m',
"weight": '6.9 kg',
"avg_spawns": 69,
"spawn_time": "20:00",
"multipliers": [ 1.58 ],
"weaknesses": [ "Fire", "Ice", "Flying", "Psychic"],
"next_evolution": [ { "num": "002", "name": "Ivysaur" }, { "num": "003", "name": "Venusaur" }]
}
In unserem Beispiel erstellen wir einen Index für weaknesses arrayfeld und überprüfen das Vorhandensein aller drei Werte Ground, Water & Fire im Array.
Cosmicworks> db.Pokemon.createIndex({'weaknesses':1})
Cosmicworks> db.Pokemon.find({"weaknesses":
{$all:["Ground","Water","Fire"]}
}
).explain()
{
explainVersion: 2,
command: "db.runCommand({explain: { 'find' : 'Pokemon', 'filter' : { 'weaknesses' : { '$all' : ['Ground', 'Water', 'Fire'] } } }})",
explainCommandPlanningTimeMillis: 10.161,
explainCommandExecTimeMillis: 21.64,
dataSize: '906 bytes',
queryPlanner: {
namespace: 'Cosmicworks.Pokemon',
winningPlan: {
stage: 'FETCH',
estimatedTotalKeysExamined: 50,
inputStage: {
stage: 'IXSCAN',
indexName: 'weaknesses_1',
isBitmap: true,
indexFilterSet: [
{ '$all': { weaknesses: [ 'Ground', 'Water', 'Fire' ] } }
],
estimatedTotalKeysExamined: 2
}
}
},
ok: 1
}
Hinweis
Für MongoServerError: Indexschlüssel ist zu groß.
Erstellen Sie eine Supportanfrage zum Aktivieren der Hintergrundindizierung, gefolgt von enableLargeIndexKeys
db.runCommand({ createIndexes: "collectionName", indexes: [{ {"index_spec"}], enableLargeIndexKeys: true });
Indexierung von geschachtelten Arrays
Azure DocumentDB ermöglicht die Indizierung geschachtelter Arrays. Im Beispiel wird ein Index für das resolutions-Feld erstellt, das innerhalb eines complains-Arrays vorhanden ist.
CarData> db.sampleColl.createIndex({"rental_history.complains.resolutions":1})
Wir überprüfen den Plan mit explain, um für alle Vermietungen zu identifizieren, ohne dass dem Kunden eine Lösung zur Verfügung gestellt wird.
CarData> db.sampleColl.find({"rental_history.complains.resolutions":{ $exists: false, $ne: []}}).explain()
{
explainVersion: 2,
command: "db.runCommand({explain: { 'find' : 'sampleColl', 'filter' : { 'rental_history.complains.resolutions' : { '$exists' : false, '$ne' : [] } } }})",
explainCommandPlanningTimeMillis: 0.12,
explainCommandExecTimeMillis: 48.721000000000004,
dataSize: '1747 kB',
queryPlanner: {
namespace: 'CarData.sampleColl',
winningPlan: {
stage: 'FETCH',
estimatedTotalKeysExamined: 1933,
inputStage: {
stage: 'IXSCAN',
indexName: 'rental_history.complains.resolutions_1',
isBitmap: true,
indexFilterSet: [
{
'$exists': { 'rental_history.complains.resolutions': false }
},
{ '$ne': { 'rental_history.complains.resolutions': [] } }
],
estimatedTotalKeysExamined: 2
}
}
},
ok: 1
}
Indizieren bestimmter Felder in einem Array
Azure DocumentDB ermöglicht das Indizieren von Feldern innerhalb eines Arrays. Im Beispiel wird ein Index für date Feld innerhalb eines accidents Arrays erstellt.
CarData> db.sampleColl.createIndex({"rental_history.accidents.date":1})
Die Beispielabfrage bewertet die Unfälle während eines bestimmten Zeitraums und zeigt, dass der Index, der auf der Eigenschaft date erstellt wurde, genutzt wird.
CarData> db.sampleColl.find({"rental_history.accidents.date":
{ $gte : ISODate("2024-05-01")
, $lt : ISODate("2024-05-07")
}
}).explain()
{
explainVersion: 2,
command: "db.runCommand({explain: { 'find' : 'sampleColl', 'filter' : { 'rental_history.accidents.date' : { '$gte' : ISODate('2024-05-01T00:00:00Z'), '$lt' : ISODate('2024-05-07T00:00:00Z') } } }})",
explainCommandPlanningTimeMillis: 19.816,
explainCommandExecTimeMillis: 48.359,
dataSize: '12 MB',
queryPlanner: {
namespace: 'CarData.sampleColl',
winningPlan: {
stage: 'FETCH',
estimatedTotalKeysExamined: 4350,
inputStage: {
stage: 'IXSCAN',
indexName: 'rental_history.accidents.date_1',
isBitmap: true,
indexFilterSet: [
{
'$range': {
'rental_history.accidents.date': {
min: ISODate("2024-05-01T00:00:00.000Z"),
max: ISODate("2024-05-07T00:00:00.000Z"),
minInclusive: true,
maxInclusive: false
}
}
}
],
estimatedTotalKeysExamined: 2
}
}
},
ok: 1
}
Hinweis
Wir verbessern derzeit die Unterstützung für geschachtelte Arrays. In bestimmten Randfällen können spezifische Indexierungsoperationen Fehler verursachen.
Indizierung von Platzhaltern ohne geschachtelte Felder
Azure DocumentDB unterstützt Wildcardindizes. Im Beispiel können wir die Indizierung aller geschachtelten Felder innerhalb des Dokuments car_infoausschließen.
// Excludes all the nested sub-document property
CarData> db.sampleColl.createIndex( {"$**":1}
,{"wildcardProjection":
{ "car_info.make":0
,"car_info.model":0
,"car_info.registration":0
,"car_info.year":0
,"rental_history":0
}
}
)
Der Ausführungsplan zeigt keine Unterstützung für Abfragen, die für model Feld ausgeführt wurden, das beim Erstellen des Platzhalterindex ausgeschlossen wurde.
CarData> db.sampleColl.find({"car_info.model":"GT Fastback"}).explain()
{
explainVersion: 2,
command: "db.runCommand({explain: { 'find' : 'sampleColl', 'filter' : { 'car_info.model' : 'GT Fastback' } }})",
explainCommandPlanningTimeMillis: 10.879,
explainCommandExecTimeMillis: 374.25100000000003,
dataSize: '0 bytes',
queryPlanner: {
namespace: 'CarData.sampleColl',
winningPlan: {
stage: 'COLLSCAN',
runtimeFilterSet: [ { '$eq': { 'car_info.model': 'GT Fastback' } } ],
estimatedTotalKeysExamined: 8700
}
},
ok: 1
}
Indizierung von Wildcards beim Ausschließen geschachtelter Objekte
Azure DocumentDB unterstützt Wildcardindizes. Im Beispiel können wir geschachtelte Objekte aus dem Dokument ausschließen.
// Wildcard index excluding nested object
[mongos] CarData> db.sampleColl.createIndex( {"$**":1},
{"wildcardProjection":
{ "car_info":0
,"rental_history":0
}
}
)
Der Ausführungsplan zeigt keine Unterstützung für Abfragen, die für geschachtelte Felder make innerhalb car_info Dokuments ausgeführt werden.
CarData> db.sampleColl.find({"car_info.make":"Mustang"}).explain()
{
explainVersion: 2,
command: "db.runCommand({explain: { 'find' : 'sampleColl', 'filter' : { 'car_info.make' : 'Mustang' } }})",
explainCommandPlanningTimeMillis: 21.271,
explainCommandExecTimeMillis: 337.475,
dataSize: '0 bytes',
queryPlanner: {
namespace: 'CarData.sampleColl',
winningPlan: {
stage: 'COLLSCAN',
runtimeFilterSet: [ { '$eq': { 'car_info.make': 'Mustang' } } ],
estimatedTotalKeysExamined: 8700
}
},
ok: 1
}
Wildcard-Indizierung unter Ausschluss von Feldern mit geschachtelten Arrays
Das Beispiel für den Wildcardindex ermöglicht das Ausschließen von Feldern aus geschachtelten Arrays. Wir verwenden pokemon Sammlung mit hervorgehobenen JSON-Formaten.
{
{
"_id": ObjectId("58f56170ee9d4bd5e610d644"),
"id": 1,
"num": 001,
"name": "Bulbasaur",
"img": "http://www.serebii.net/pokemongo/pokemon/001.png",
"type": [ 'Grass', 'Poison' ],
"height": '0.71 m',
"weight": '6.9 kg',
"avg_spawns": 69,
"spawn_time": "20:00",
"multipliers": [ 1.58 ],
"weaknesses": [ "Fire", "Ice", "Flying", "Psychic"],
"next_evolution": [ { "num": "002", "name": "Ivysaur" }, { "num": "003", "name": "Venusaur" }]
}
}
Wir erstellen einen Index für alle Felder innerhalb der JSON, mit Ausnahme von numname Feldern innerhalb eines Arrays.
Cosmicworks> db.Pokemon.createIndex( {"$**":1},
{"wildcardProjection":
{ "id":0
,"name":0
,"multipliers":0
,"next_evolution.num":0
,"next_evolution.name":0
}
}
)
Der Erklärungsplan zeigt keine Indexnutzung bei der Abfrage eines name Feldes innerhalb next_evolution Arrays.
Cosmicworks> db.Pokemon.find({"next_evolution.name":"Venusaur"}).explain()
{
explainVersion: 2,
command: "db.runCommand({explain: { 'find' : 'Pokemon', 'filter' : { 'next_evolution.name' : 'Venusaur' } }})",
explainCommandPlanningTimeMillis: 0.799,
explainCommandExecTimeMillis: 0.869,
dataSize: '1090 bytes',
queryPlanner: {
namespace: 'Cosmicworks.Pokemon',
winningPlan: {
stage: 'COLLSCAN',
runtimeFilterSet: [ { '$eq': { 'next_evolution.name': 'Venusaur' } } ],
estimatedTotalKeysExamined: 76
}
},
ok: 1
}
Nächste Schritte
- Hier erfahren Sie mehr über die Indizierung von Wildcards.
- Erfahren Sie mehr über die Indizierung bewährter Methoden für die effizientesten Ergebnisse.
- Informationen zur Hintergrundindizierung
- Hier erfahren Sie, wie Sie mit der Textindizierung arbeiten können.