MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Sertakan Bidang Tertentu dalam Indeks Wildcard di MongoDB

Saat Anda membuat indeks wildcard di MongoDB, Anda memiliki opsi untuk menentukan satu bidang, semua bidang, atau hanya beberapa.

Anda dapat menggunakan wildcardProjection parameter untuk menyertakan atau mengecualikan jalur bidang tertentu dari indeks karakter pengganti. Artikel ini menyajikan contoh penyertaan bidang tertentu dalam indeks karakter pengganti.

Contoh Dokumen

Misalkan kita memiliki koleksi yang disebut pets dengan dokumen sebagai berikut:

{
	"_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")
	}
}

Kita dapat membuat indeks karakter pengganti di seluruh koleksi, tetapi hanya menyertakan bidang yang kita inginkan.

Buat Indeks

Ini contohnya:

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

Keluaran:

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

{ "$**" : 1 } bagian inilah yang membuat indeks wildcard, dan wildcardProjection bagian adalah bagian yang menentukan bidang mana yang akan disertakan. Dalam hal ini kami telah menyertakan details.type bidang dan details.born bidang. Memberi mereka nilai 1 secara eksplisit memasukkannya ke dalam indeks.

Melihat Indeks

Kita dapat melihat indeks pada koleksi dengan memanggil getIndexes() cara:

db.pets.getIndexes()

Hasil:

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

Kita dapat melihat bahwa ada dua indeks.

  • Indeks pertama ada di _id bidang. Ini dibuat saat koleksi dibuat (MongoDB membuat indeks unik di bidang _id selama pembuatan koleksi).
  • Indeks kedua adalah indeks wildcard kami. Kita dapat melihat bahwa itu secara otomatis bernama $**_1 , dan itu termasuk bidang yang kami tentukan.

Uji Indeks

Kami juga dapat menjalankan beberapa kueri untuk melihat apakah indeks kami akan digunakan atau tidak.

Secara teori, kueri berikut harus menggunakan indeks:

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

Untuk menguji ini, kita dapat menambahkan explain() metode untuk melihat rencana kueri:

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

Hasil:

{
	"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
}

Kami dapat melihat bahwa itu menggunakan pemindaian indeks (IXSCAN) pada indeks kami.

Berbeda dengan ini, inilah yang terjadi saat kami menjalankan kueri pada bidang yang tidak termasuk dalam indeks:

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

Hasil:

{
	"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
}

Dalam hal ini ia melakukan pemindaian koleksi (COLLSCAN), sehingga seperti yang diharapkan, ia tidak menggunakan indeks.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Kesalahan Fatal - kelas 'Mongo' tidak ditemukan

  2. Mongoid:temukan melalui Array id

  3. Array Mongodb $push dan $tarik

  4. Cara Menginstal Edisi Komunitas MongoDB di Ubuntu

  5. Bagaimana saya bisa menonaktifkan pesan log MongoDB di konsol?