sql >> Database >  >> NoSQL >> MongoDB

Specifieke velden opnemen in een wildcard-index in MongoDB

Wanneer u een wildcard-index maakt in MongoDB, heeft u de mogelijkheid om een ​​enkel veld, alle velden of slechts enkele op te geven.

U kunt de wildcardProjection . gebruiken parameter om specifieke veldpaden op te nemen of uit te sluiten van de wildcardindex. Dit artikel geeft een voorbeeld van het opnemen van specifieke velden in de wildcard-index.

Voorbeelddocument

Stel dat we een verzameling hebben met de naam pets met de volgende documenten:

{
	"_id" : 1,
	"name" : "Wag",
	"details" : {
		"type" : "Dog",
		"weight" : 20,
		"awards" : {
			"Florida Dog Awards" : "Top Dog",
			"New York Marathon" : "Fastest Dog",
			"Sumo 2020" : "Biggest Dog"
		}
	}
}
{
	"_id" : 2,
	"name" : "Fetch",
	"details" : {
		"born" : ISODate("2020-06-22T14:00:00Z"),
		"color" : "Black"
	}
}
{
	"_id" : 3,
	"name" : "Scratch",
	"details" : {
		"eats" : [
			"Mouse Porridge",
			"Bird Soup",
			"Caviar"
		],
		"type" : "Cat",
		"born" : ISODate("2020-12-19T14:00:00Z")
	}
}

We kunnen een wildcard-index maken voor de hele verzameling, maar alleen de velden opnemen die we willen.

De index maken

Hier is een voorbeeld:

db.pets.createIndex(
  { "$**" : 1 },
  {
    "wildcardProjection" : {
      "details.type" : 1,
      "details.born" : 1
    }
  }
)

Uitgang:

{
	"createdCollectionAutomatically" : false,
	"numIndexesBefore" : 1,
	"numIndexesAfter" : 2,
	"ok" : 1
}

De { "$**" : 1 } een deel is wat de wildcard-index maakt, en de wildcardProjection deel is het deel dat specificeert welke velden moeten worden opgenomen. In dit geval hebben we de details.type veld en de details.born veld. Geef ze een waarde van 1 neemt ze expliciet op in de index.

Bekijk de index

We kunnen de indexen van de collectie bekijken door de getIndexes() . aan te roepen methode:

db.pets.getIndexes()

Resultaat:

[
	{
		"v" : 2,
		"key" : {
			"_id" : 1
		},
		"name" : "_id_"
	},
	{
		"v" : 2,
		"key" : {
			"$**" : 1
		},
		"name" : "$**_1",
		"wildcardProjection" : {
			"details.type" : 1,
			"details.born" : 1
		}
	}
]

We kunnen zien dat er twee indexen zijn.

  • De eerste index staat op de _id veld. Dit is gemaakt toen de verzameling werd gemaakt (MongoDB creëert een unieke index op het _id-veld tijdens het maken van een verzameling).
  • De tweede index is onze wildcard-index. We kunnen zien dat het automatisch de naam $**_1 heeft gekregen , en het bevat de velden die we hebben opgegeven.

Test de index

We kunnen ook enkele zoekopdrachten uitvoeren om te zien of onze index zal worden gebruikt of niet.

In theorie zou de volgende query de index moeten gebruiken:

db.pets.find( { "details.type" : "Dog" } )

Om dit te testen, kunnen we de explain() . toevoegen methode om het zoekplan te bekijken:

db.pets.find( { "details.type" : "Dog" } ).explain()

Resultaat:

{
	"queryPlanner" : {
		"plannerVersion" : 1,
		"namespace" : "PetHotel.pets",
		"indexFilterSet" : false,
		"parsedQuery" : {
			"details.type" : {
				"$eq" : "Dog"
			}
		},
		"queryHash" : "F1C5286F",
		"planCacheKey" : "5326DE93",
		"winningPlan" : {
			"stage" : "FETCH",
			"inputStage" : {
				"stage" : "IXSCAN",
				"keyPattern" : {
					"$_path" : 1,
					"details.type" : 1
				},
				"indexName" : "$**_1",
				"isMultiKey" : false,
				"multiKeyPaths" : {
					"$_path" : [ ],
					"details.type" : [ ]
				},
				"isUnique" : false,
				"isSparse" : false,
				"isPartial" : false,
				"indexVersion" : 2,
				"direction" : "forward",
				"indexBounds" : {
					"$_path" : [
						"[\"details.type\", \"details.type\"]"
					],
					"details.type" : [
						"[\"Dog\", \"Dog\"]"
					]
				}
			}
		},
		"rejectedPlans" : [ ]
	},
	"ok" : 1
}

We kunnen zien dat het een indexscan (IXSCAN) op onze index heeft gebruikt.

In tegenstelling hiermee, is dit wat er gebeurt als we een query uitvoeren op een veld dat niet is opgenomen in de index:

db.pets.find( { "details.awards.New York Marathon" : "Fastest Dog" } ).explain()

Resultaat:

{
	"queryPlanner" : {
		"plannerVersion" : 1,
		"namespace" : "PetHotel.pets",
		"indexFilterSet" : false,
		"parsedQuery" : {
			"details.awards.New York Marathon" : {
				"$eq" : "Fastest Dog"
			}
		},
		"queryHash" : "EC0D5185",
		"planCacheKey" : "EC0D5185",
		"winningPlan" : {
			"stage" : "COLLSCAN",
			"filter" : {
				"details.awards.New York Marathon" : {
					"$eq" : "Fastest Dog"
				}
			},
			"direction" : "forward"
		},
		"rejectedPlans" : [ ]
	},
	"ok" : 1
}

In dit geval deed het een collectiescan (COLLSCAN), dus zoals verwacht gebruikte het de index niet.


  1. MongoDB - Een verzameling maken

  2. Een overzicht van database-indexering voor MongoDB

  3. MongoDB bulkWrite()

  4. MongoDB samengestelde sleutel