MongoDB - Pengindeksan Lanjutan
kami telah memasukkan dokumen berikut dalam koleksi bernama pengguna seperti yang ditunjukkan di bawah ini -
db.users.insert(
{
"address": {
"city": "Los Angeles",
"state": "California",
"pincode": "123"
},
"tags": [
"music",
"cricket",
"blogs"
],
"name": "Tom Benzamin"
}
)
Dokumen di atas berisi address sub-document dan a tags array.
Mengindeks Bidang Array
Misalkan kita ingin mencari dokumen pengguna berdasarkan tag pengguna. Untuk ini, kami akan membuat indeks pada array tag dalam koleksi.
Membuat indeks pada larik pada gilirannya membuat entri indeks terpisah untuk setiap bidangnya. Jadi dalam kasus kami ketika kami membuat indeks pada larik tag, indeks terpisah akan dibuat untuk musik nilainya, kriket dan blog.
Untuk membuat indeks pada larik tag, gunakan kode berikut -
>db.users.createIndex({"tags":1})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 2,
"numIndexesAfter" : 3,
"ok" : 1
}
>
Setelah membuat indeks, kita dapat mencari di kolom tag koleksi seperti ini -
> db.users.find({tags:"cricket"}).pretty()
{
"_id" : ObjectId("5dd7c927f1dd4583e7103fdf"),
"address" : {
"city" : "Los Angeles",
"state" : "California",
"pincode" : "123"
},
"tags" : [
"music",
"cricket",
"blogs"
],
"name" : "Tom Benzamin"
}
>
Untuk memverifikasi bahwa pengindeksan yang tepat digunakan, gunakan yang berikut ini explain perintah -
>db.users.find({tags:"cricket"}).explain()
Ini memberi Anda hasil sebagai berikut -
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "mydb.users",
"indexFilterSet" : false,
"parsedQuery" : {
"tags" : {
"$eq" : "cricket"
}
},
"queryHash" : "9D3B61A7",
"planCacheKey" : "04C9997B",
"winningPlan" : {
"stage" : "FETCH",
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"tags" : 1
},
"indexName" : "tags_1",
"isMultiKey" : false,
"multiKeyPaths" : {
"tags" : [ ]
},
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 2,
"direction" : "forward",
"indexBounds" : {
"tags" : [
"[\"cricket\", \"cricket\"]"
]
}
}
},
"rejectedPlans" : [ ]
},
"serverInfo" : {
"host" : "Krishna",
"port" : 27017,
"version" : "4.2.1",
"gitVersion" : "edf6d45851c0b9ee15548f0f847df141764a317e"
},
"ok" : 1
}
>
Perintah di atas menghasilkan "cursor": "BtreeCursor tags_1" yang mengonfirmasi bahwa pengindeksan yang tepat digunakan.
Mengindeks Bidang Sub-Dokumen
Misalkan kita ingin mencari dokumen berdasarkan field kota, negara bagian dan kode PIN. Karena semua bidang ini adalah bagian dari bidang sub-dokumen alamat, kami akan membuat indeks pada semua bidang sub-dokumen.
Untuk membuat indeks pada ketiga bidang sub-dokumen, gunakan kode berikut -
>db.users.createIndex({"address.city":1,"address.state":1,"address.pincode":1})
{
"numIndexesBefore" : 4,
"numIndexesAfter" : 4,
"note" : "all indexes already exist",
"ok" : 1
}
>
Setelah indeks dibuat, kita dapat mencari bidang sub-dokumen mana pun yang menggunakan indeks ini sebagai berikut -
> db.users.find({"address.city":"Los Angeles"}).pretty()
{
"_id" : ObjectId("5dd7c927f1dd4583e7103fdf"),
"address" : {
"city" : "Los Angeles",
"state" : "California",
"pincode" : "123"
},
"tags" : [
"music",
"cricket",
"blogs"
],
"name" : "Tom Benzamin"
}
Ingatlah bahwa ekspresi kueri harus mengikuti urutan indeks yang ditentukan. Jadi indeks yang dibuat di atas akan mendukung kueri berikut -
>db.users.find({"address.city":"Los Angeles","address.state":"California"}).pretty()
{
"_id" : ObjectId("5dd7c927f1dd4583e7103fdf"),
"address" : {
"city" : "Los Angeles",
"state" : "California",
"pincode" : "123"
},
"tags" : [
"music",
"cricket",
"blogs"
],
"name" : "Tom Benzamin"
}
>