MongoDB için Azure Cosmos DB API’sinde dizin oluşturmayı yönetme
Uygulama hedefı:
MongoDB için Azure Cosmos DB API
MongoDB için Azure Cosmos DB API'si, Azure Cosmos DB'nin temel dizin yönetimi Cosmos kullanır. Bu makalede MongoDB için Azure veritabanı API'sini Cosmos dizin eklemeye odaklanabilirsiniz. Dizinler, verilerinizi sorgulamanın kabaca daha hızlı bir büyüklük sırasına sahip olması için özel veri yapılarıdır.
MongoDB sunucu sürümü 3.6 ve üzerinde dizin oluşturma
Azure Cosmos DB'nin MongoDB sunucu sürümü 3.6+ için API'si, alanı ve parça anahtarını (yalnızca parçalı koleksiyonlarda) otomatik olarak _id dizinler. API, parça anahtarı başına alanın _id benzersizliğini otomatik olarak zorlar.
MongoDB API'si, varsayılan olarak tüm alanları dizine alan Azure Cosmos DB SQL API'lerinden farklı davranır.
Dizin oluşturma ilkesi düzenleme
Dizin oluşturma ilkenizi uygulamanın içindeki Veri Gezgini düzenlemenizi Azure portal. . Dizin oluşturma ilkesi düzenleyicisinden tek bir alan ve joker karakter dizinleri Veri Gezgini:
Not
Dizin oluşturma ilkesi düzenleyicisini kullanarak bileşik dizinler oluştura Veri Gezgini.
Dizin türleri
Tek alan
Herhangi bir alanda dizin oluşturabilirsiniz. Tek alan dizininin sıralama düzeni önemli değildir. Aşağıdaki komut, alanında bir dizin name oluşturur:
db.coll.createIndex({name:1})
Aşağıdaki dizinde aynı tek alan name dizinini Azure portal:
Bir sorgu, kullanılabilir olduğu yerde birden çok tek alan dizini kullanır. Koleksiyon başına en fazla 500 tek alan dizini oluşturabilirsiniz.
Bileşik dizinler (MongoDB sunucu sürümü 3.6+)
MongoDB API'sinde, sorgunuz aynı anda birden çok alanda sıralamaya ihtiyaç varsa bileşik dizinler gereklidir. Birden çok filtreye sahip olan ve sıralaması gereken sorgular için bileşik dizin yerine birden çok tek alan dizini oluşturun ve dizin oluşturma maliyetlerini düşürebilirsiniz.
Bileşik dizin veya bileşik dizinde yer alan her alan için tek alan dizinleri, sorgularda filtreleme için aynı performansa neden olur.
Not
İç içe özellikler veya diziler üzerinde bileşik dizinler oluşturalamaz.
Aşağıdaki komut ve alanlarında bileşik dizin name age oluşturur:
db.coll.createIndex({name:1,age:1})
Bileşik dizinleri, aşağıdaki örnekte gösterildiği gibi birden çok alanda aynı anda verimli bir şekilde sıralamak için kullanabilirsiniz:
db.coll.find().sort({name:1,age:1})
Bir sorguyu tüm alanlarda ters sıralama düzeniyle verimli bir şekilde sıralamak için önceki bileşik dizini de kullanabilirsiniz. Aşağıda bir örnek verilmiştir:
db.coll.find().sort({name:-1,age:-1})
Ancak bileşik dizinde bulunan yolların dizisinin sorguyla tam olarak eşleşmesi gerekir. Ek bileşik dizin gerektiren bir sorgu örneği:
db.coll.find().sort({age:1,name:1})
Not
Bileşik dizinler yalnızca sonuçları sıralanan sorgularda kullanılır. Birden çok filtreye sahip olan ve sıralaması gerekip gerek yok olan sorgular için çok tek alanlı dizinler oluşturun.
Çok anahtarlı dizinler
Azure Cosmos DB, dizilerde depolanan içeriği dizine alan çok anahtarlı dizinler oluşturur. Bir alanı dizi değeriyle dizinlersanız, Azure Cosmos DB dizideki her öğeyi otomatik olarak dizinler.
Jeo-uzamsal dizinler
Birçok jeo-uzamsal işleç, jeo-uzamsal dizinlerden yararlanabilir. Şu anda Azure Cosmos DB'nin MongoDB API'si 2dsphere dizinleri destekler. API henüz dizinleri 2d desteklemez.
Alanda jeo-uzamsal dizin oluşturma örneği: location
db.coll.createIndex({ location : "2dsphere" })
Metin dizinleri
Azure Cosmos DB'nin MongoDB API'si şu anda metin dizinlerini desteklemez. Dizeler üzerinde metin araması sorguları için Azure Azure Bilişsel Arama DB ile Cosmos gerekir.
Joker dizinler
Bilinmeyen alanlara karşı sorguları desteklemek için joker dizinleri kullanabilirsiniz. Ailelerin verilerini tutan bir koleksiyonunuz olduğunu düşünebilirsiniz.
Bu koleksiyonda örnek bir belgenin bir parçası şu şekildedir:
"children": [
{
"firstName": "Henriette Thaulow",
"grade": "5"
}
]
Burada bir örnek daha ve bu kez içinde biraz farklı özellikler kümesi children vardır:
"children": [
{
"familyName": "Merriam",
"givenName": "Jesse",
"pets": [
{ "givenName": "Goofy" },
{ "givenName": "Shadow" }
]
},
{
"familyName": "Merriam",
"givenName": "John",
}
]
Bu koleksiyonda belgelerin birçok farklı olası özelliği olabilir. Dizide yer alan tüm verilerin dizinini oluşturmak için iki seçeneğiniz vardır: her bir özellik için ayrı dizinler oluşturun veya dizinin tamamı için bir joker children dizin children oluşturun.
Joker karakter dizini oluşturma
Aşağıdaki komut, içindeki tüm özelliklerde joker karakter dizini children oluşturur:
db.coll.createIndex({"children.$**" : 1})
MongoDB'den farklı olarak, joker dizinler sorgu önkeserleri içinde birden çok alanı destekleyebildi. Her özellik için ayrı bir dizin oluşturmak yerine tek bir joker dizin kullanırsanız sorgu performansında bir fark olmaz.
Joker karakter söz dizimi kullanarak aşağıdaki dizin türlerini oluşturabilirsiniz:
- Tek alan
- Jeo-uzamsal
Tüm özelliklerin dizinini oluşturma
Tüm alanlarda joker karakter dizini oluşturmak için aşağıdakini kullanabilirsiniz:
db.coll.createIndex( { "$**" : 1 } )
Ayrıca, aşağıdaki dizinlerde yer alan Veri Gezgini joker Azure portal:
Not
Geliştirmeyi yeni başlatıyorsanız, tüm alanlarda joker karakter diziniyle başlamayı kesinlikle öneririz. Bu, geliştirmeyi basitleştirebilir ve sorguları iyileştirmeyi kolaylaştırır.
Birçok alanı olan belgeler, yazma ve güncelleştirmeler için yüksek İstek Birimi (RU) ücretine sahip olabilir. Bu nedenle, yoğun yazma kullanan bir iş yükünüz varsa, joker karakter dizinleri kullanmak yerine yolları tek tek dizinle almayı tercih etmek gerekir.
Sınırlamalar
Joker dizinler aşağıdaki dizin türlerinden veya özelliklerden herhangi birini desteklemez:
- Bileşik
- TTL
- Benzersiz
MongoDB'den farklı olarak, Azure Cosmos DB'nin MongoDB API'sinde aşağıdakiler için joker dizinleri kullanasınız:
Belirli birden çok alanın dahil edildiği bir joker dizin oluşturma
db.coll.createIndex( { "$**" : 1 }, { "wildcardProjection " : { "children.givenName" : 1, "children.grade" : 1 } } )Belirli birden çok alanın hariç tutulduğu bir joker dizin oluşturma
db.coll.createIndex( { "$**" : 1 }, { "wildcardProjection" : { "children.givenName" : 0, "children.grade" : 0 } } )
Alternatif olarak birden çok joker dizin oluşturabilirsiniz.
Dizin özellikleri
Aşağıdaki işlemler kablo protokolü sürüm 4.0'a hizmet veren hesaplar ve önceki sürümleri sunan hesaplarda yaygındır. Desteklenen dizinler ve dizinli özellikler hakkında daha fazla bilgi bulabilirsiniz.
Benzersiz dizinler
Benzersiz dizinler, iki veya daha fazla belge için dizinli alanlar için aynı değerin yer olmadığının zorlanmaları için kullanışlıdır.
Önemli
Benzersiz dizinler yalnızca koleksiyon boş olduğunda oluşturulabilir (belge yoktur).
Aşağıdaki komut, alanında benzersiz bir dizin student_id oluşturur:
globaldb:PRIMARY> db.coll.createIndex( { "student_id" : 1 }, {unique:true} )
{
"_t" : "CreateIndexesResponse",
"ok" : 1,
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 4
}
Parçalı koleksiyonlar için benzersiz bir dizin oluşturmak için parça (bölüm) anahtarını sağlamış oluruz. Diğer bir deyişle, parçalı bir koleksiyondaki tüm benzersiz dizinler, alanlardan birinin bölüm anahtarı olduğu bileşik dizinlerdir.
Aşağıdaki komutlar, ve alanlarında benzersiz bir dizin ile parçalı bir koleksiyon coll (parça university anahtarıdır) student_id university oluşturun:
globaldb:PRIMARY> db.runCommand({shardCollection: db.coll._fullName, key: { university: "hashed"}});
{
"_t" : "ShardCollectionResponse",
"ok" : 1,
"collectionsharded" : "test.coll"
}
globaldb:PRIMARY> db.coll.createIndex( { "university" : 1, "student_id" : 1 }, {unique:true});
{
"_t" : "CreateIndexesResponse",
"ok" : 1,
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 3,
"numIndexesAfter" : 4
}
Yukarıdaki örnekte yan tümcesini yok "university":1 sayarak aşağıdaki iletiyle birlikte bir hata döndürür:
parça anahtar deseni { university : 1.0 } ile {student_id : 1.0} üzerinde benzersiz dizin oluşturulamıyor
TTL dizinleri
Belirli bir koleksiyonda belge süre sonu etkinleştirmek için bir yaşam süresi (TTL) dizini oluşturmanız gerekir. TTL dizini, alanında değeri olan _ts bir expireAfterSeconds dizindir.
Örnek:
globaldb:PRIMARY> db.coll.createIndex({"_ts":1}, {expireAfterSeconds: 10})
Yukarıdaki komut, koleksiyonda son db.coll 10 saniye içinde değiştirilmeen tüm belgeleri siler.
Not
_ts alanı Azure Cosmos DB'ye özeldir ve MongoDB istemcilerinden erişilemez. Belgenin son değişikliğinin zaman damgasını içeren ayrılmış (sistem) bir özelliktir.
Dizin ilerlemesini izleme
MongoDB için Azure Cosmos DB API'sini 3.6+ sürümü, veritabanı örneğinde dizin ilerlemesini izlemek currentOp() için komutunu destekler. Bu komut, bir veritabanı örneğinde devam eden işlemler hakkında bilgi içeren bir belge döndürür. Komutunu kullanarak currentOp yerel MongoDB'de devam eden tüm işlemleri izleyebilirsiniz. Azure Cosmos DB'nin MongoDB API'sinde bu komut yalnızca dizin işlemi izlemesini destekler.
Aşağıda, dizinin ilerlemesini izlemek için komutunun nasıl currentOp kullanıla bir örnek verilmiştir:
Bir koleksiyonun dizin ilerlemesini al:
db.currentOp({"command.createIndexes": <collectionName>, "command.$db": <databaseName>})Veritabanındaki tüm koleksiyonlar için dizin ilerlemesini alır:
db.currentOp({"command.$db": <databaseName>})Azure depolama hesabında tüm veritabanları ve koleksiyonlar için dizin ilerleme Cosmos edinin:
db.currentOp({"command.createIndexes": { $exists : true } })
Dizin ilerleme durumu çıktısı örnekleri
Dizin ilerleme durumu ayrıntıları, geçerli dizin işlemi için ilerleme yüzdesini gösterir. Dizin ilerlemenin farklı aşamaları için çıkış belgesi biçimini gösteren bir örnek aşağıdaki gibidir:
"Foo" koleksiyonu ve "çubuk" veritabanındaki yüzde 60'lık bir dizin işlemi aşağıdaki çıkış belgesine sahip olur. alanı,
Inprog[0].progress.totalhedef tamamlanma yüzdesi olarak 100'leri gösterir.{ "inprog" : [ { ………………... "command" : { "createIndexes" : foo "indexes" :[ ], "$db" : bar }, "msg" : "Index Build (background) Index Build (background): 60 %", "progress" : { "done" : 60, "total" : 100 }, …………..….. } ], "ok" : 1 }Bir dizin işlemi "foo" koleksiyonu ve "çubuk" veritabanı üzerinde başlatıldı ise, çıkış belgesi ölçülebilir bir düzeye ulaşana kadar yüzde 0 ilerleme gösterebilir.
{ "inprog" : [ { ………………... "command" : { "createIndexes" : foo "indexes" :[ ], "$db" : bar }, "msg" : "Index Build (background) Index Build (background): 0 %", "progress" : { "done" : 0, "total" : 100 }, …………..….. } ], "ok" : 1 }Devam eden dizin işlemi tamam olduğunda, çıkış belgesi boş işlemler
inproggösterir.{ "inprog" : [], "ok" : 1 }
Arka plan dizin güncelleştirmeleri
Background dizin özelliği için belirtilen değer ne olursa olsun, dizin güncelleştirmeleri her zaman arka planda yapılır. Dizin güncelleştirmeleri İstek Birimlerini (RU) diğer veritabanı işlemlerine göre daha düşük öncelikli olarak tükettiğinden, dizin değişiklikleri yazma, güncelleştirme veya silme işlemleri için kapalı kalma süresine neden olmayacaktır.
Yeni dizin eklerken okuma kullanılabilirliği etkilenmez. Sorgular yalnızca dizin dönüşümü tamamlandıktan sonra yeni dizinleri kullanır. Dizin dönüştürme sırasında sorgu altyapısı mevcut dizinleri kullanmaya devam eder, bu nedenle dizin oluşturma dönüştürmesi sırasında dizin oluşturma değişikliğini başlatana kadar gözlemlettiklerine benzer okuma performansını gözlemlersiniz. Yeni dizinler eklerken eksik veya tutarsız sorgu sonuçları riski de yoktur.
Dizinler kaldırılarak hemen çalıştırılarak bırakılan dizinlerde filtreleri olan sorgular çalıştırılarak, dizin dönüştürmesi tamamlanana kadar sonuçlar tutarsız ve tamamlanmamış olabilir. Dizinleri kaldırırsanız, sorgular yeni kaldırılan bu dizinleri filtrelese sorgu altyapısı tutarlı veya eksiksiz sonuçlar sağlamaz. Geliştiricilerin çoğu dizinleri bırakmaz ve ardından hemen sorgulamaya çalışmaz. Bu nedenle, uygulamada bu durumun pek olası değildir.
Not
ReIndex komutu
komutu reIndex bir koleksiyonda tüm dizinleri yeniden oluşturacak. Bazı nadir durumlarda, sorgu performansı veya koleksiyonunuza ilişkin diğer dizin sorunları komutu çalıştırarak reIndex çözülebilir. Dizin oluşturmayla ilgili sorunlar yaşıyorsanız, dizinleri komutuyla yeniden reIndex oluşturma önerilen bir yaklaşımdır.
Aşağıdaki söz reIndex dizimlerini kullanarak komutu çalıştırabilirsiniz:
db.runCommand({ reIndex: <collection> })
Aşağıdaki söz dizimini kullanarak komutunun çalıştırarak reIndex koleksiyonunuz için sorgu performansını geliştirebilir olup olamayabilirsiniz:
db.runCommand({"customAction":"GetCollection",collection:<collection>, showIndexes:true})
Örnek çıktı:
{
"database" : "myDB",
"collection" : "myCollection",
"provisionedThroughput" : 400,
"indexes" : [
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "myDB.myCollection",
"requiresReIndex" : true
},
{
"v" : 1,
"key" : {
"b.$**" : 1
},
"name" : "b.$**_1",
"ns" : "myDB.myCollection",
"requiresReIndex" : true
}
],
"ok" : 1
}
Sorgu reIndex performansını geliştirecekse requiresReIndex true olur. Sorgu reIndex performansını artırmazsa bu özellik atlanır.
Dizinlerle koleksiyonları geçirme
Şu anda, yalnızca koleksiyon belge içerdiğinde benzersiz dizinler oluşturabilirsiniz. Popüler MongoDB geçiş araçları, verileri içeri aktardikten sonra benzersiz dizinleri oluşturma denemesi. Bu sorunu gidermek için, geçiş aracının denemesi yerine ilgili koleksiyonları ve benzersiz dizinleri el ile oluşturabilirsiniz. (Komut satırı bayrağını mongorestore kullanarak için bu davranışı --noIndexRestore gerçekleştirebilirsiniz.)
MongoDB sürüm 3.2 için dizin oluşturma
MongoDB kablo protokolünün 3.2 sürümüyle uyumlu azure Cosmos hesapları için kullanılabilir dizin oluşturma özellikleri ve varsayılanlar farklıdır. Hesap sürümünü kontrol edin ve sürüm 3.6'ya yükseltebilirsiniz.
3.2 sürümünü kullanıyorsanız, bu bölümde sürüm 3.6+ ile arasındaki temel farklar özetler.
Varsayılan dizinleri bırakma (sürüm 3.2)
MongoDB için Azure Cosmos DB API'sini 3.6+ sürümlerinden farklı olarak, sürüm 3.2 varsayılan olarak her özelliği dizinler. Bir koleksiyonun bu varsayılan dizinlerini bırakmak için aşağıdaki komutu kullanabilirsiniz ( coll ):
> db.coll.dropIndexes()
{ "_t" : "DropIndexesResponse", "ok" : 1, "nIndexesWas" : 3 }
Varsayılan dizinleri bıraktıktan sonra, sürüm 3.6+'da olduğu gibi daha fazla dizin ekleyin.
Bileşik dizinler (sürüm 3.2)
Bileşik dizinler bir belgenin birden çok alanına başvurular içerir. Bileşik dizin oluşturmak için 3.6 veya 4.0 sürümüne yükseltin.
Joker dizinler (sürüm 3.2)
Joker dizin oluşturmak için 4.0 veya 3.6 sürümüne yükseltin.
Sonraki adımlar
- Azure Cosmos DB’de dizin oluşturma
- Azure Cosmos DB'de verilerin yaşam süresiyle otomatik olarak süresinin dolması
- Bölümleme ve dizin oluşturma arasındaki ilişki hakkında bilgi edinmek için Azure Cosmos kapsayıcısı sorgulama makalesine bakın.
- Azure veritabanına geçiş için kapasite planlaması yapmaya Cosmos mı? Kapasite planlaması için mevcut veritabanı kümeniz hakkında bilgi kullanabilirsiniz.
- Mevcut veritabanı kümenizin sanal çekirdek ve sunucu sayısıyla ilgili tüm bilginiz varsa, sanal çekirdek veya vCPUS kullanarak istek birimlerini tahmin hakkında bilgi edinebilirsiniz
- Geçerli veritabanı iş yükünüz için tipik istek oranlarını biliyorsanız Azure Cosmos DB kapasite planlayıcısı kullanarak istek birimlerini tahmin hakkında bilgi edinin