MongoDB - Gelişmiş İndeksleme
aşağıdaki belgeyi aşağıda gösterildiği gibi kullanıcılar adlı koleksiyona ekledik -
db.users.insert(
{
"address": {
"city": "Los Angeles",
"state": "California",
"pincode": "123"
},
"tags": [
"music",
"cricket",
"blogs"
],
"name": "Tom Benzamin"
}
)
Yukarıdaki belge bir address sub-document ve bir tags array.
Dizi Alanlarını İndeksleme
Kullanıcı belgelerini kullanıcının etiketlerine göre aramak istediğimizi varsayalım. Bunun için koleksiyondaki etiketler dizisi üzerinde bir indeks oluşturacağız.
Dizi üzerinde bir dizin oluşturmak, sırayla her bir alanı için ayrı dizin girdileri oluşturur. Bu nedenle, etiketler dizisi üzerinde bir dizin oluşturduğumuzda, değerleri müzik, kriket ve bloglar için ayrı dizinler oluşturulacaktır.
Etiketler dizisi üzerinde bir dizin oluşturmak için aşağıdaki kodu kullanın -
>db.users.createIndex({"tags":1})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 2,
"numIndexesAfter" : 3,
"ok" : 1
}
>
İndeksi oluşturduktan sonra, koleksiyonun etiketler alanında şu şekilde arama yapabiliriz -
> db.users.find({tags:"cricket"}).pretty()
{
"_id" : ObjectId("5dd7c927f1dd4583e7103fdf"),
"address" : {
"city" : "Los Angeles",
"state" : "California",
"pincode" : "123"
},
"tags" : [
"music",
"cricket",
"blogs"
],
"name" : "Tom Benzamin"
}
>
Uygun indekslemenin kullanıldığını doğrulamak için aşağıdakileri kullanın explain komut -
>db.users.find({tags:"cricket"}).explain()
Bu size şu sonucu verir -
{
"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
}
>
Yukarıdaki komut, uygun indekslemenin kullanıldığını doğrulayan "cursor": "BtreeCursor etiketleri_1" ile sonuçlandı.
Alt Belge Alanlarının İndekslenmesi
Belgeleri şehir, eyalet ve pin kodu alanlarına göre aramak istediğimizi varsayalım. Tüm bu alanlar adres alt belge alanının bir parçası olduğu için, alt belgenin tüm alanlarında bir dizin oluşturacağız.
Alt belgenin üç alanında da bir dizin oluşturmak için aşağıdaki kodu kullanın -
>db.users.createIndex({"address.city":1,"address.state":1,"address.pincode":1})
{
"numIndexesBefore" : 4,
"numIndexesAfter" : 4,
"note" : "all indexes already exist",
"ok" : 1
}
>
Dizin oluşturulduktan sonra, bu dizini kullanarak aşağıdaki gibi alt belge alanlarından herhangi birini arayabiliriz -
> 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"
}
Sorgu ifadesinin belirtilen dizinin sırasına uyması gerektiğini unutmayın. Yani yukarıda oluşturulan dizin aşağıdaki sorguları destekleyecektir -
>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"
}
>