MongoDB için Azure Cosmos DB'de dizin oluşturmayı yönetme

ŞUNLAR IÇIN GEÇERLIDIR: MongoDB

MongoDB için Azure Cosmos DB, Azure Cosmos DB'nin temel dizin yönetimi özelliklerinden yararlanır. Bu makalede MongoDB için Azure Cosmos DB kullanarak dizin ekleme konusuna odaklanmaktadır. Dizinler, verilerinizi sorgulamayı kabaca bir büyüklük sırasına göre daha hızlı hale getiren özel veri yapılarıdır.

MongoDB sunucusu sürüm 3.6 ve üzeri için dizin oluşturma

MongoDB için Azure Cosmos DB sunucu sürümü 3.6+ alanı ve parça anahtarını otomatik olarak dizine alır _id (yalnızca parçalı koleksiyonlarda). API, parça anahtarı başına alanın benzersizliğini _id otomatik olarak zorlar.

MongoDB API'si, tüm alanları varsayılan olarak dizinleyen NoSQL için Azure Cosmos DB'den farklı davranır.

Dizin oluşturma ilkesi düzenleniyor

Dizin oluşturma ilkenizi Azure portalındaki Veri Gezgini düzenlemenizi öneririz. Veri Gezgini dizin oluşturma ilkesi düzenleyicisinden tek alan ve joker karakter dizinleri ekleyebilirsiniz:

Indexing policy editor

Dekont

Veri Gezgini dizin oluşturma ilkesi düzenleyicisini kullanarak bileşik dizinler oluşturamazsınız.

Dizin türleri

Tek alan

Tek bir alanda dizinler oluşturabilirsiniz. Tek alan dizininin sıralama düzeni önemli değildir. Aşağıdaki komut alanında namebir dizin oluşturur:

db.coll.createIndex({name:1})

Azure portalında aynı tek alan dizinini name oluşturabilirsiniz:

Add name index in indexing policy editor

Bir sorgu, kullanılabilir durumda birden çok tek alan dizini kullanır. Koleksiyon başına en fazla 500 tek alan dizini oluşturabilirsiniz.

Bileşik dizinler (MongoDB sunucusu sürüm 3.6+)

MongoDB API'sinde, sorgunuzun aynı anda birden çok alana göre sıralama yapabilmesi gerekiyorsa bileşik dizinler gereklidir . Sıralaması gerekmeyen birden çok filtreye sahip sorgular için, dizin oluşturma maliyetlerinden tasarruf etmek için bileşik dizin yerine birden çok tek alan dizini oluşturun.

Bileşik dizindeki her alan için bileşik dizin veya tek alan dizinleri, sorgularda filtreleme için aynı performansa neden olur.

dizilerle ilgili sınırlamalar nedeniyle iç içe alanlardaki bileşik dizinler varsayılan olarak desteklenmez. İç içe yerleştirilmiş alanınız bir dizi içermiyorsa, dizin amaçlandığı gibi çalışır. İç içe yerleştirilmiş alanınız bir dizi içeriyorsa (yolun herhangi bir yerinde), bu değer dizinde yoksayılır.

Örneğin, yolunun people.dylan.age üzerinde dizi olmadığından, içeren bileşik dizin bu durumda çalışır:

{
  "people": {
    "dylan": {
      "name": "Dylan",
      "age": "25"
    },
    "reed": {
      "name": "Reed",
      "age": "30"
    }
  }
}

Yolda bir dizi olduğundan bu bileşik dizin bu durumda çalışmaz:

{
  "people": [
    {
      "name": "Dylan",
      "age": "25"
    },
    {
      "name": "Reed",
      "age": "30"
    }
  ]
}

Bu özellik veritabanı hesabınız için 'EnableUniqueCompoundNestedDocs' özelliği etkinleştirilerek etkinleştirilebilir.

Dekont

Dizilerde bileşik dizinler oluşturamazsınız.

Aşağıdaki komut ve agealanlarında name bir bileşik dizin oluşturur:

db.coll.createIndex({name:1,age:1})

Bileşik dizinleri, aşağıdaki örnekte gösterildiği gibi aynı anda birden çok alanda verimli bir şekilde sıralamak için kullanabilirsiniz:

db.coll.find().sort({name:1,age:1})

Tüm alanlarda karşıt sıralama düzenine sahip bir sorguyu verimli bir şekilde sıralamak için önceki bileşik dizini de kullanabilirsiniz. Bir örnek aşağıda verilmiştir:

db.coll.find().sort({name:-1,age:-1})

Ancak bileşik dizindeki yolların dizisi sorguyla tam olarak eşleşmelidir. Ek bileşik dizin gerektiren bir sorgu örneği aşağıda verilmiştir:

db.coll.find().sort({age:1,name:1})

Çok anahtarlı dizinler

Azure Cosmos DB, dizilerde depolanan içeriği dizine almak için çok anahtarlı dizinler oluşturur. Dizi değeri olan bir alanın dizinini oluşturursanız, Azure Cosmos DB dizideki her öğeyi otomatik olarak dizine alır.

Jeo-uzamsal dizinler

Birçok jeo-uzamsal operatör jeo-uzamsal dizinlerden yararlanacaktır. Şu anda MongoDB için Azure Cosmos DB dizinleri desteklemektedir 2dsphere . API henüz dizinleri desteklemiyor 2d .

Aşağıda alanda jeo-uzamsal dizin oluşturma örneği verilmiştir location :

db.coll.createIndex({ location : "2dsphere" })

Metin dizinleri

MongoDB için Azure Cosmos DB şu anda metin dizinlerini desteklememektedir. Dizelerdeki metin arama sorguları için Azure Cosmos DB ile Azure AI Search tümleştirmesini kullanmanız gerekir.

Joker karakter dizinleri

Bilinmeyen alanlara yönelik sorguları desteklemek için joker karakter dizinlerini kullanabilirsiniz. Ailelerle ilgili verileri barındıran bir koleksiyonunuz olduğunu düşünelim.

Bu koleksiyondaki örnek belgenin bir bölümü aşağıda verilmiştir:

"children": [
   {
     "firstName": "Henriette Thaulow",
     "grade": "5"
   }
]

Bu kez içinde biraz farklı özellikler kümesi bulunan başka bir örnek aşağıda verilmişti children:

"children": [
    {
     "familyName": "Merriam",
     "givenName": "Jesse",
     "pets": [
         { "givenName": "Goofy" },
         { "givenName": "Shadow" }
         ]
   },
   {
     "familyName": "Merriam",
     "givenName": "John",
   }
]

Bu koleksiyonda, belgelerin birçok farklı olası özelliği olabilir. Dizideki children tüm verilerin dizinini oluşturmak istiyorsanız iki seçeneğiniz vardır: her bir özellik için ayrı dizinler oluşturun veya dizinin tamamı children için bir joker karakter dizini oluşturun.

Joker karakter dizini oluşturma

Aşağıdaki komut içindeki childrentüm özelliklerde bir joker karakter dizini oluşturur:

db.coll.createIndex({"children.$**" : 1})

MongoDB'den farklı olarak, joker dizinler sorgu koşullarında birden çok alanı destekleyebilir. Her özellik için ayrı bir dizin oluşturmak yerine tek bir joker karakter dizini kullanırsanız sorgu performansında bir fark olmayacaktır.

Joker karakter söz dizimini kullanarak aşağıdaki dizin türlerini oluşturabilirsiniz:

  • Tek alan
  • Jeo-uzamsal

Tüm özellikleri dizine ekleme

Tüm alanlarda joker karakter dizini şu şekilde oluşturabilirsiniz:

db.coll.createIndex( { "$**" : 1 } )

Azure portalındaki Veri Gezgini kullanarak joker karakter dizinleri de oluşturabilirsiniz:

Add wildcard index in indexing policy editor

Dekont

Geliştirmeye yeni başlıyorsanız, tüm alanlarda joker karakter diziniyle başlamanızı kesinlikle öneririz. Bu, geliştirmeyi basitleştirebilir ve sorguları iyileştirmeyi kolaylaştırabilir.

Birçok alanı olan belgelerde yazma işlemleri ve güncelleştirmeler için yüksek bir İstek Birimi (RU) ücreti olabilir. Bu nedenle, yoğun yazma içeren bir iş yükünüz varsa, joker karakter dizinlerini kullanmak yerine yolları tek tek dizine almayı tercih etmeniz gerekir.

Dekont

Veri içeren mevcut koleksiyonlarda benzersiz dizin desteği önizleme aşamasında sağlanır. Bu özellik, 'EnableUniqueIndexReIndex' özelliği etkinleştirilerek veritabanı hesabınız için etkinleştirilebilir.

Sınırlamalar

Joker dizinler aşağıdaki dizin türlerinden veya özelliklerinden hiçbirini desteklemez:

  • Bileşik
  • TTL
  • Benzersiz

MongoDB'den farklı olarak MongoDB için Azure Cosmos DB'de aşağıdakiler için joker dizinleri kullanamazsı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ümlere hizmet veren hesaplar için yaygındır. Desteklenen dizinler ve dizine alınan özellikler hakkında daha fazla bilgi edinebilirsiniz.

Benzersiz dizinler

Benzersiz dizinler , iki veya daha fazla belgenin dizinlenmiş alanlar için aynı değeri içermemesi için kullanışlıdır.

Aşağıdaki komut, alanında student_idbenzersiz bir dizin 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ğlamanız gerekir. Başka bir deyişle, parçalanmış koleksiyondaki tüm benzersiz dizinler, alanlardan birinin parça anahtarı olduğu bileşik dizinlerdir. Siparişteki ilk alan parça anahtarı olmalıdır.

Aşağıdaki komutlar, ve alanlarında universitystudent_id benzersiz bir dizine sahip bir parçalı koleksiyon coll (parça anahtarıdıruniversity) oluşturur:

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ümcesinin "university":1 atlanması aşağıdaki iletiyle birlikte bir hata döndürür:

cannot create unique index over {student_id : 1.0} with shard key pattern { university : 1.0 }

Sınırlamalar

Koleksiyon boşken benzersiz dizinlerin oluşturulması gerekir.

dizilerle ilgili sınırlamalar nedeniyle iç içe alanlardaki benzersiz dizinler varsayılan olarak desteklenmez. İç içe yerleştirilmiş alanınız bir dizi içermiyorsa, dizin amaçlandığı gibi çalışır. İç içe yerleştirilmiş alanınız bir dizi içeriyorsa (yolun herhangi bir yerinde), bu değer benzersiz dizinde yoksayılır ve bu değer için benzersizlik korunmaz.

Örneğin, yolda dizi olmadığından people.tom.age üzerindeki benzersiz bir dizin bu durumda çalışır:

{ "people": { "tom": { "age": "25" }, "mark": { "age": "30" } } }

ancak bu durumda çalışmaz çünkü yolda bir dizi vardır:

{ "people": { "tom": [ { "age": "25" } ], "mark": [ { "age": "30" } ] } }

Bu özellik veritabanı hesabınız için 'EnableUniqueCompoundNestedDocs' özelliği etkinleştirilerek etkinleştirilebilir.

TTL dizinleri

Belirli bir koleksiyonda belge süre sonunu etkinleştirmek için yaşam süresi (TTL) dizini oluşturmanız gerekir. TTL dizini, alanda değeri olan _ts bir expireAfterSeconds dizindir.

Örneğin:

globaldb:PRIMARY> db.coll.createIndex({"_ts":1}, {expireAfterSeconds: 10})

Yukarıdaki komut, koleksiyonda db.coll son 10 saniye içinde değiştirilmemiş tüm belgeleri siler.

Dekont

_ts alanı Azure Cosmos DB'ye özgüdür ve MongoDB istemcilerinden erişilemez. Belgenin son değişikliğinin zaman damgasını içeren ayrılmış (sistem) bir özelliktir.

Dizin ilerleme durumunu izleme

MongoDB için Azure Cosmos DB'nin 3.6+ sürümü, veritabanı örneğinde dizin ilerleme durumunu izlemek için komutunu destekler currentOp() . Bu komut, veritabanı örneğindeki devam eden işlemler hakkında bilgi içeren bir belge döndürür. Yerel MongoDB'de devam eden tüm işlemleri izlemek için komutunu kullanırsınız currentOp . MongoDB için Azure Cosmos DB'de bu komut yalnızca dizin işlemini izlemeyi destekler.

Dizin ilerleme durumunu currentOp izlemek için komutunun nasıl kullanılacağını gösteren bazı örnekler aşağıda verilmiştir:

  • Bir koleksiyon için dizin ilerleme durumunu alma:

    db.currentOp({"command.createIndexes": <collectionName>, "command.$db": <databaseName>})
    
  • Veritabanındaki tüm koleksiyonlar için dizin ilerleme durumunu alma:

    db.currentOp({"command.$db": <databaseName>})
    
  • Azure Cosmos DB hesabındaki tüm veritabanları ve koleksiyonlar için dizin ilerleme durumunu alın:

    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. Aşağıda, dizin ilerlemesinin farklı aşamaları için çıkış belgesi biçimini gösteren bir örnek verilmişti:

  • Yüzde 60'ı tamamlanmış bir "foo" koleksiyonu ve "çubuk" veritabanındaki dizin işlemi aşağıdaki çıkış belgesine sahip olur. Alanda Inprog[0].progress.total hedef tamamlanma yüzdesi olarak 100 gösterilir.

    {
          "inprog" : [
          {
                  ………………...
                  "command" : {
                          "createIndexes" : foo
                          "indexes" :[ ],
                          "$db" : bar
                  },
                  "msg" : "Index Build (background) Index Build (background): 60 %",
                  "progress" : {
                          "done" : 60,
                          "total" : 100
                  },
                  …………..…..
          }
          ],
          "ok" : 1
    }
    
  • "Foo" koleksiyonu ve "çubuk" veritabanında dizin işlemi yeni başladıysa, çıkış belgesi ölçülebilir bir düzeye ulaşana kadar yüzde 0 ilerleme gösteriyor olabilir.

    {
          "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 tamamlandığında, çıkış belgesinde boş inprog işlemler gösterilir.

    {
        "inprog" : [],
        "ok" : 1
    }
    

Arka plan dizini güncelleştirmeleri

Background dizin özelliği için belirtilen değerden bağımsız olarak, dizin güncelleştirmeleri her zaman arka planda yapılır. Dizin güncelleştirmeleri diğer veritabanı işlemlerinden daha düşük bir önceliğe sahip İstek Birimlerini (RU) tükettiğinden, dizin değişiklikleri yazma, güncelleştirme veya silme işlemleri için kapalı kalma süresine neden olmaz.

Yeni dizin eklerken okuma kullanılabilirliğini etkilemez. 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şlatmadan önce gözlemlediğinize benzer okuma performansını gözlemlersiniz. Yeni dizinler eklerken, eksik veya tutarsız sorgu sonuçları riski de yoktur.

Dizinler kaldırılırken ve bırakılan dizinlerde filtreleri olan sorgular hemen çalıştırılırken, dizin dönüştürme işlemi tamamlanana kadar sonuçlar tutarsız ve eksik olabilir. Dizinleri kaldırırsanız, sorgular bu yeni kaldırılan dizinleri filtrelediğinde sorgu altyapısı tutarlı veya eksiksiz sonuçlar sağlamaz. Geliştiricilerin çoğu dizinleri bırakmaz ve hemen sorgulamaya çalışır, bu nedenle pratikte bu durum pek olası değildir.

Dekont

Dizin ilerleme durumunu izleyebilirsiniz.

ReIndex komutu

komutu bir reIndex koleksiyondaki tüm dizinleri yeniden oluşturur. Bazı nadir durumlarda, sorgu performansı veya koleksiyonunuzdaki diğer dizin sorunları komutu çalıştırılarak reIndex çözülebilir. Dizin oluşturmayla ilgili sorunlarla karşılaşıyorsanız, dizinleri komutuyla reIndex yeniden oluşturmak önerilen bir yaklaşımdır.

Komutunu aşağıdaki söz dizimini reIndex kullanarak çalıştırabilirsiniz:

db.runCommand({ reIndex: <collection> })

Komutunun çalıştırılmasının koleksiyonunuzdaki sorgu performansını geliştirip geliştirmeyeceğini denetlemek için aşağıdaki söz dizimini reIndex kullanabilirsiniz:

db.runCommand({"customAction":"GetCollection",collection:<collection>, showIndexes:true})

Örnek çıkış:

{
        "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 performansını geliştirecekse reIndex requiresReIndex true olacaktır. Sorgu performansını iyileştirmezse reIndex , bu özellik atlanır.

Dizinlerle koleksiyonları geçirme

Şu anda yalnızca koleksiyon belge içermediğinde benzersiz dizinler oluşturabilirsiniz. Popüler MongoDB geçiş araçları, verileri içeri aktardıktan sonra benzersiz dizinleri oluşturmaya çalışır. Bu sorunu aşmak için, geçiş aracının denemesine izin vermek yerine ilgili koleksiyonları ve benzersiz dizinleri el ile oluşturabilirsiniz. (Bu davranışı için mongorestore komut satırında bayrağını --noIndexRestore kullanarak 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 DB hesapları için kullanılabilir dizin oluşturma özellikleri ve varsayılanları farklıdır. Hesabınızın sürümünü denetleyebilir ve 3.6 sürümüne yükseltebilirsiniz.

Sürüm 3.2 kullanıyorsanız, bu bölümde 3.6 ve üzeri sürümlerle önemli farklar özetlenmektedir.

Varsayılan dizinler bırakılıyor (sürüm 3.2)

MongoDB için Azure Cosmos DB'nin 3.6+ sürümünden farklı olarak, sürüm 3.2 varsayılan olarak her özelliği dizine alır. Bir koleksiyoncoll için bu varsayılan dizinleri () bırakmak için aşağıdaki komutu kullanabilirsiniz:

> db.coll.dropIndexes()
{ "_t" : "DropIndexesResponse", "ok" : 1, "nIndexesWas" : 3 }

Varsayılan dizinleri bıraktıktan sonra, 3.6+ sürümünde olduğu gibi daha fazla dizin ekleyebilirsiniz.

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 istiyorsanız 3.6 veya 4.0 sürümüne yükseltin.

Joker dizinler (sürüm 3.2)

Joker karakter dizini oluşturmak istiyorsanız 4.0 veya 3.6 sürümüne yükseltin.

Sonraki adımlar