Dizinler, veritabanı performansında önemli bir faktördür. Şuna çok benzer: bir kitaptaki konuları sayfa numaralarıyla eşleyen bir kitabın dizini, bir veritabanı dizini veritabanındaki öğeleri veritabanındaki konumlarıyla eşler. Şu işlemleri gerçekleştirdiğinizde bir dizin kullanabilir. Böylece o veritabanı, konumlarını hızlı bir şekilde ve talep ettiğiniz öğeler arasından seçim yapın.
Bu sayfada, Cloud Firestore tarafından kullanılan iki dizin türü açıklanmaktadır: tek alanlı dizinler ve birleşik dizin.
Dizin tanımı ve yapısı
Belirli bir belgedeki alanlar listesinde bir dizin, dizin modunu kullanabilirsiniz.
Bir dizin, dizin tanımında adı geçen her alan için bir giriş içerir. İlgili içeriği oluşturmak için kullanılan aşağıdaki kriterlere göre sorgular için potansiyel sonuç olan tüm dokümanları dizine ekler. Bir dokümanın dizine eklenebilmesi için dizine eklenmiş bir değere sahip olması gerekir için ayarlanır. Dizin tanımı bir alana için herhangi bir değer ayarlanmamışsa bu doküman dizinde görünmez. Bu durumda, doküman hiçbir zaman dizine dayalı herhangi bir sorgunun sonucu olarak döndürülmez.
Bileşik dizin, alan değerlerine göre, anlamına gelir.
Her sorgunun arkasındaki dizin
Bir sorgu için dizin yoksa çoğu veritabanı, kendi içerik öğelerini tarar bu da veritabanı büyüdükçe daha da yavaşlayan bir süreçtir. Cloud Firestore, tüm sorgular için geçerli olmalıdır. Sonuç olarak, sorgu performansı boyuta, veri kümesindeki öğelerin sayısı değil, veri kümesindeki öğelerin sayısı farklıdır.
Daha az dizin yönetimi, daha fazla uygulama geliştirme
Cloud Firestore, geçirdiğiniz süreyi azaltan özellikler içerir harcamanız gerektiği anlamına gelir. En temel otomatik olarak oluşturulur. Uygulamanızı kullanıp test ederken Cloud Firestore, riskleri belirleyip Uygulamanızın ihtiyaç duyduğu ek dizinleri oluşturun.
Dizin türleri
Cloud Firestore iki tür dizin kullanır: tek alan ve birleşik. Dizine eklenen alan sayısının yanı sıra tek alan ve bileşik dizinleri yönetme şekliniz açısından farklılık gösterir.
Tek alanlı dizinler
Tek alanlı dizin, tüm dokümanların sıralanmış eşlemesini bir koleksiyon oluşturur. Tek alanlı bir dizindeki her giriş bir dokümanın belirli bir alan için değerini ve dokümanın konumunu kaydeder ekler. Cloud Firestore, birçok işlem yapmak için bu dizinleri kullanır temel sorgular. Tek alanlı dizinleri, veritabanınızın temel özelliklerini yapılandırarak otomatik dizine ekleme ayarları ve dizin muafiyetleri.
Otomatik dizine ekleme
Varsayılan olarak Cloud Firestore, tek alanlı dizinleri otomatik bir şekilde korur bir dokümandaki her alan ve bir haritadaki her alt alan için. Cloud Firestore. tek alanlı dizinler için aşağıdaki varsayılan ayarları kullanır:
Cloud Firestore, dizi olmayan ve eşleme olmayan her alan için iki tane tanımlar Biri artan modda olmak üzere koleksiyon-kapsamı tek alanlı dizinler ve biri azalan modda.
Cloud Firestore, her harita alanı için şunları oluşturur:
- Dizi olmayan, harita dışı her alt alan için bir koleksiyon kapsamlı artan dizin.
- Dizi olmayan, harita dışı her alt alan için bir koleksiyon kapsamı azalan dizin.
- Her dizi alt alanı için bir koleksiyon kapsamı dizi-içeren dizin.
- Cloud Firestore, her harita alt alanını yinelemeli olarak dizine ekler.
Cloud Firestore, bir dokümandaki her dizi alanı için ve , koleksiyon kapsamlı bir dizi içeren dizin sağlar.
Koleksiyon grubu kapsamına sahip tek alanlı dizinler varsayılandır.
Tek alanlı dizin muafiyetleri
Bir alanı otomatik dizine ekleme kapsamınızdan muaf tutabilirsiniz. ayarları için tek alanlı dizin muafiyeti oluşturun. Dizine ekleme muafiyeti, veritabanı genelindeki otomatik dizin ayarlarını geçersiz kılar. muafiyet, otomatik dizine ekleme ayarlarınızın tek alanlı bir dizini etkinleştirebilir otomatik dizine ekleme işlemini yapan tek alanlı bir dizini devre dışı bırakır veya etkinleştiremez. Muafiyetlerin yararlı olabileceği durumlar için dizine eklemeyle ilgili en iyi uygulamalar.
Tüm uygulamalara koleksiyon düzeyinde dizin muafiyetleri eklemek için *
alanı yolu değerini kullanın
alanları olabilir. Örneğin, comments
koleksiyon grubu için
comments
koleksiyon grubundaki tüm alanlarla eşleştirmek için *
alan yolunu ve
koleksiyon grubu altındaki tüm alanların dizine eklenmesini devre dışı bırakın. Ardından
istisnaları ekleyebilirsiniz. Trafiğin azaltılması
Dizine eklenen alanların sayısı, depolama maliyetlerini azaltır ve yazmayı iyileştirebilir
bazı yolları da görmüştük.
Bir harita alanı için tek alanlı dizin muafiyeti oluşturursanız haritanın alt alanlar bu ayarları devralır. Bununla birlikte, tek alanlı dizin tanımlayabilirsiniz. hariç tutmanızı öneririz. Bir alt alan için muafiyeti silerseniz alt alan, varsa üst alanının muafiyet ayarlarını veya veritabanı genelindeki ayarları kullanarak varsayılan ayarları kullanmanız gerekir.
Tek alanlı dizin muafiyetleri oluşturmak ve yönetmek için şuraya bakın: Dizinleri yönetin.
Birleşik dizinler
Bileşik dizin, koleksiyondaki tüm dokümanların sıralı eşlemesini depolar, alanlar listesini temel alır.
Cloud Firestore, şunları desteklemek için bileşik dizinler kullanır: şu anda tek alanlı dizinler tarafından desteklenmiyor.
Cloud Firestore, bunun gibi bileşik dizinleri otomatik olarak oluşturmaz büyük sayıda olası alan nedeniyle tek alanlı dizinler için geçerlidir. emin olun. Bunun yerine, Cloud Firestore sizin için, belirtilen ve oluşturulan gereken bileşik dizinleri gözden geçirin.
Bir dizin tarafından desteklenmeyen bir sorguyu denediğinizde Cloud Firestore eksik dosyayı oluşturmak için izleyebileceğiniz bir bağlantıyı içeren hata mesajı dizin.
Ayrıca, bileşik dizinleri manuel olarak tanımlayabilir ve yönetebilirsiniz veya Firebase için KSA. Proje yönetimi hakkında daha fazla bileşik dizinler için Dizinleri yönetme bölümüne bakın.
Dizin modları ve sorgu kapsamları
Tek alanlı ve birleşik dizinleri farklı şekilde yapılandırırsınız ancak her ikisi için de yapılandırdığınızdan emin olun.
Dizin modları
Bir dizin tanımladığınızda, dizine eklenen her alan için bir dizin modu seçersiniz. Her biri alanın dizin modu, bu alanda belirli sorgu deyimlerini destekler. Siz şu dizin modlarından birini seçebilir:
Dizin modu | Açıklama |
---|---|
Artan | Alanda < , <= , == , >= , > , != , in ve not-in sorgu deyimlerini ve bu alan değerine göre sonuçları artan düzende sıralamayı destekler. |
Azalan | Alanda < , <= , == , >= , > , != , in ve not-in sorgu deyimlerini destekler ve sonuçları bu alan değerine göre azalan düzende sıralamayı destekler. |
Dizi-içerir | Alanda array-contains ve array-contains-any sorgu ifadelerini destekler. |
Vektör | Alanda FindNearest sorgu deyimlerini destekler. |
Sorgu kapsamları
Her dizin, bir koleksiyon veya koleksiyon grubuna ayarlanır. Bu biliniyor şu şekilde ayarlayın:
- Koleksiyon kapsamı
- Cloud Firestore varsayılan olarak koleksiyon kapsamına sahip dizinler oluşturur. Bu dizinler, tek bir koleksiyondan sonuç döndüren sorguları destekler.
- Koleksiyon grubu kapsamı
- Koleksiyon grubu, aynı koleksiyon kimliğine sahip tüm koleksiyonları içerir. Alıcı: filtrelenmiş döndüren bir koleksiyon grubu sorgusu çalıştırma bir koleksiyon grubundan sıralı sonuçlar almak için dizin oluşturun.
Varsayılan sıralama ve __name__
alanı
Dokümanları dizin modlarına göre sıralamanın yanı sıra,
her alan için belirtildiğinde (artan veya azalan) dizinler,
her belgenin __name__
alanına göre sıralayabilirsiniz. __name__
değeri
alanının tam doküman yolu olarak ayarlandığından emin olun. Bu, belgelerin
değerleri, doküman yoluna göre sıralanır.
Varsayılan olarak __name__
alanı, sonla aynı yönde sıralanır.
sıralanan alanı belirtir. Örneğin:
Toplama | Dizine eklenen alanlar | Sorgu kapsamı |
---|---|---|
şehirler | __name__ |
adı, Toplama |
şehirler | __name__ |
eyalet, Toplama |
şehirler | __name__ |
ülke, nüfus, Toplama |
Sonuçları varsayılan olmayan __name__
yönüne göre sıralamak için
oluşturmanız gerekir.
Dizin özellikleri
Sorgunun en verimli şekilde yürütülmesine olanak tanıyan bir dizin, aşağıdaki özellikler tarafından tanımlanır:
- Eşitlik filtrelerinde kullanılan alanlar
- Sıralama siparişlerinde kullanılan alanlar
- Aralık ve eşitsizlik filtrelerinde kullanılan (sıralama siparişlerine halihazırda dahil olmayanlar) alanlar
- Toplamalarda kullanılan alanlar (sıralama siparişleri ile aralık ve eşitsizlik filtrelerine halihazırda dahil olmayanlar)
Cloud Firestore, sorguların sonuçlarını şu şekilde hesaplar:
- Sorgu koleksiyonuna, filtre özelliklerine, filtre operatörlerine ve sıralama siparişlerine karşılık gelen dizini tanımlar.
- Taramanın başlatılacağı dizin konumunu tanımlar. Başlangıç konumu, sorgunun eşitlik filtrelerinin önüne eklenir ve ilk
orderBy
alanındaki aralık ve eşitsizlik filtreleriyle biter. - Tarama işlemi aşağıdakilerden birini yapana kadar dizini taramaya başlar ve tüm filtrelere uygun olan her dokümanı döndürür:
- Filtre koşullarını karşılamayan bir dokümanla karşılaşır ve sonraki dokümanların filtre koşullarını hiçbir zaman tam olarak karşılamayacağını onaylar.
- Dizinin sonuna ulaşır.
- Sorgu tarafından istenen maksimum sayıda sonuç toplar.
Dizine ekleme örneği
Sizin için tek alanlı dizinleri otomatik olarak oluşturarak Cloud Firestore
Bu özellik, uygulamanızın en temel veritabanı sorgularını hızla desteklemesine olanak tanır.
Tek alanlı dizinler, alan değerlerine göre basit sorgular gerçekleştirmenizi sağlar
ve <
, <=
, ==
, >=
, >
ve in
karşılaştırıcıları. Dizi alanlarında
array-contains
ve array-contains-any
sorguları gerçekleştirebilirsiniz.
Anlatmak için aşağıdaki örnekleri müşterinin bakış açısından inceleyin
dizin oluşturma. Aşağıdaki snippet,
cities
koleksiyonunda birkaç city
doküman içerir ve name
, state
Her belge için country
, capital
, population
ve tags
alanları:
Web
var citiesRef = db.collection("cities"); citiesRef.doc("SF").set({ name: "San Francisco", state: "CA", country: "USA", capital: false, population: 860000, regions: ["west_coast", "norcal"] }); citiesRef.doc("LA").set({ name: "Los Angeles", state: "CA", country: "USA", capital: false, population: 3900000, regions: ["west_coast", "socal"] }); citiesRef.doc("DC").set({ name: "Washington, D.C.", state: null, country: "USA", capital: true, population: 680000, regions: ["east_coast"] }); citiesRef.doc("TOK").set({ name: "Tokyo", state: null, country: "Japan", capital: true, population: 9000000, regions: ["kanto", "honshu"] }); citiesRef.doc("BJ").set({ name: "Beijing", state: null, country: "China", capital: true, population: 21500000, regions: ["jingjinji", "hebei"] });
Varsayılan otomatik dizine ekleme ayarları göz önünde bulundurulduğunda, Cloud Firestore güncelleme dizi olmayan alan başına bir artan tek alanlı dizin, bir tane azalan tek- dizi olmayan alan başına alan dizini ve bir dizi içeren tek alanlı dizin dizi alanına girin. Aşağıdaki tabloda her satır, tek alanlı dizin:
Toplama | Alana dizine eklendi | Sorgu kapsamı |
---|---|---|
şehirler | adı | Toplama |
şehirler | eyalet | Toplama |
şehirler | ülke | Toplama |
şehirler | büyük harf | Toplama |
şehirler | nüfus | Toplama |
şehirler | adı | Toplama |
şehirler | eyalet | Toplama |
şehirler | ülke | Toplama |
şehirler | büyük harf | Toplama |
şehirler | nüfus | Toplama |
şehirler | array-contains bölge |
Toplama |
Tek alanlı dizinler tarafından desteklenen sorgular
Otomatik olarak oluşturulan bu tek alanlı dizinleri kullanarak, çok kolay bir şekilde şunun gibi sorgulardır:
Web
const stateQuery = citiesRef.where("state", "==", "CA"); const populationQuery = citiesRef.where("population", "<", 100000); const nameQuery = citiesRef.where("name", ">=", "San Francisco");
Ayrıca in
ve bileşik eşitlik (==
) sorguları da oluşturabilirsiniz:
Web
citiesRef.where('country', 'in', ["USA", "Japan", "China"]) // Compound equality queries citiesRef.where("state", "==", "CO").where("name", "==", "Denver") citiesRef.where("country", "==", "USA") .where("capital", "==", false) .where("state", "==", "CA") .where("population", "==", 860000)
Aralık karşılaştırması (<
, <=
,
>
veya >=
) ya da farklı bir alana göre sıralama yapmanız gerekiyorsa bir
birleşik dizin.
array-contains
dizini, regions
dizi alanını sorgulamanızı sağlar:
Web
citiesRef.where("regions", "array-contains", "west_coast") // array-contains-any and array-contains use the same indexes citiesRef.where("regions", "array-contains-any", ["west_coast", "east_coast"])
Bileşik dizinler tarafından desteklenen sorgular
Cloud Firestore, şunları desteklemek için bileşik dizinler kullanır: bileşik sorgular tek alanlı dizinler tarafından hâlihazırda desteklenmemektedir. Örneğin, şu sorgular için bir bileşik dizin gerektirir:
Web
citiesRef.where("country", "==", "USA").orderBy("population", "asc") citiesRef.where("country", "==", "USA").where("population", "<", 3800000) citiesRef.where("country", "==", "USA").where("population", ">", 690000) // in and == clauses use the same index citiesRef.where("country", "in", ["USA", "Japan", "China"]) .where("population", ">", 690000)
Bu sorgular için aşağıdaki bileşik dizin gereklidir. Sorgu,
country
alanı için bir eşitlik (==
veya in
) içeriyorsa,
dizin moduna geçebiliriz. Varsayılan olarak
eşitsizlik yan tümceleri,
eşitsizlik ifadesidir.
Toplama | Dizine eklenen alanlar | Sorgu kapsamı |
---|---|---|
şehirler | (veya ) ülke, nüfus | Toplama |
Aynı sorguları azalan sıralama düzeniyle çalıştırmak için
population
için azalan yönde ek bir birleşik dizin gerekir:
Web
citiesRef.where("country", "==", "USA").orderBy("population", "desc") citiesRef.where("country", "==", "USA") .where("population", "<", 3800000) .orderBy("population", "desc") citiesRef.where("country", "==", "USA") .where("population", ">", 690000) .orderBy("population", "desc") citiesRef.where("country", "in", ["USA", "Japan", "China"]) .where("population", ">", 690000) .orderBy("population", "desc")
Toplama | Dizine eklenen alanlar | Sorgu kapsamı |
---|---|---|
şehirler | ülke, nüfus | Toplama |
şehirler | ülke, nüfus | Toplama |
dizin birleştirmenin neden olduğu performans kaybını önlemek için dizin birleştirme
array-contains
veya array-contains-any
sorgusunu birleştiren bir bileşik dizin
şu ifadeleri kullanın:
Web
citiesRef.where("regions", "array-contains", "east_coast") .where("capital", "==", true) // array-contains-any and array-contains use the same index citiesRef.where("regions", "array-contains-any", ["west_coast", "east_coast"]) .where("capital", "==", true)
Toplama | Dizine eklenen alanlar | Sorgu kapsamı |
---|---|---|
şehirler | array-contains etiketleri, | (veya ) büyük harfToplama |
Koleksiyon grubu dizinleri tarafından desteklenen sorgular
Koleksiyon grubu kapsamına sahip bir dizin göstermek için
city
dokümanından bazılarına landmarks
alt koleksiyon eklendi:
Web
var citiesRef = db.collection("cities"); citiesRef.doc("SF").collection("landmarks").doc().set({ name: "Golden Gate Bridge", category : "bridge" }); citiesRef.doc("SF").collection("landmarks").doc().set({ name: "Golden Gate Park", category : "park" }); citiesRef.doc("DC").collection("landmarks").doc().set({ name: "National Gallery of Art", category : "museum" }); citiesRef.doc("DC").collection("landmarks").doc().set({ name: "National Mall", category : "park" });
Aşağıdaki tek alanlı dizini koleksiyon kapsamıyla kullanarak sorgulayabilirsiniz:
category
alanına göre tek bir şehrin landmarks
koleksiyonu:
Toplama | Dizine eklenen alanlar | Sorgu kapsamı |
---|---|---|
önemli noktalar | (veya ) kategorisi | Toplama |
Web
citiesRef.doc("SF").collection("landmarks").where("category", "==", "park") citiesRef.doc("SF").collection("landmarks").where("category", "in", ["park", "museum"])
Örneğin, tüm şehirlerdeki önemli noktaları sorgulamak istiyorsanız,
bu sorguyu tüm landmarks
içeren koleksiyon grubunda çalıştırırsınız
koleksiyonlar oluşturun. Ayrıca, tek alanlı landmarks
dizinini de etkinleştirmelisiniz
koleksiyon grubu kapsamı:
Toplama | Dizine eklenen alanlar | Sorgu kapsamı |
---|---|---|
önemli noktalar | (veya ) kategorisi | Koleksiyon grubu |
Bu dizin etkinleştirildiğinde landmarks
koleksiyon grubunu sorgulayabilirsiniz:
Web
var landmarksGroupRef = db.collectionGroup("landmarks"); landmarksGroupRef.where("category", "==", "park") landmarksGroupRef.where("category", "in", ["park", "museum"])
Filtrelenmiş sonuçları döndüren bir koleksiyon grubu sorgusu çalıştırmak için: ilişkili tek bir alanı veya birleşik bir alanı etkinleştirmek için dizin oluşturun. Filtrelenmeyen koleksiyon grubu sorguları ancak sipariş sonuçları için ek dizin tanımı gerekmez.
Örneğin, aşağıdaki koleksiyon grubu sorgusunu etkinleştirmeden ek bir dizin:
Web
db.collectionGroup("landmarks").get()
Dizin girişleri
Projenizin yapılandırılmış dizinleri ve bir belgenin yapısı, bir dokümandaki dizin girişlerinin sayısıdır. Dizin girişleri dizin girişi sayısı sınırını aşmamalıdır.
Aşağıdaki örnekte bir dokümanın dizin girişleri gösterilmektedir.
Doküman
/cities/SF
city_name : "San Francisco"
temperatures : {summer: 67, winter: 55}
neighborhoods : ["Mission", "Downtown", "Marina"]
Tek Alanlı dizinler
- şehir_adı ASC
- şehir_adı DESC
- sıcaklıklar.yaz ASC
- sıcaklıklar.summer DESC
- sıcaklıklar.winter ASC
- sıcaklıklar.winter DESC
- Mahalleler Dizisi İçerir (ASC ve DESC)
Birleşik dizinler
- şehir_adı ASC, mahalleler ARRAY
- şehir_adı DESC, mahalleler ARRAY
Dizin girişleri
Bu dizine ekleme yapılandırması, doküman:
Dizin | Dizine eklenmiş veriler |
---|---|
Tek alanlı dizin girişleri | |
şehir_adı ASC | City_name: "İstanbul" |
şehir_adı DESC | City_name: "İstanbul" |
sıcaklıklar.yaz ASC | sıcaklıklar.yaz: 67 |
sıcaklıklar.summer DESC | sıcaklıklar.yaz: 67 |
sıcaklıklar.winter ASC | sıcaklıklar.winter: 55 |
sıcaklıklar.winter DESC | sıcaklıklar.winter: 55 |
mahalle dizisinde ASC içerir | muhitler: "Misyon" |
mahalleler Dizisi Şunu İçerir: DESC | muhitler: "Misyon" |
mahalle dizisinde ASC içerir | mahalleler: "Şehir merkezi" |
mahalleler Dizisi Şunu İçerir: DESC | mahalleler: "Şehir merkezi" |
mahalle dizisinde ASC içerir | mahalleler: "İstanbul" |
mahalleler Dizisi Şunu İçerir: DESC | mahalleler: "İstanbul" |
Bileşik dizin girişleri | |
şehir_adı ASC, mahalleler ARRAY | City_name: "İstanbul", mahalleler: "İstanbul" |
şehir_adı ASC, mahalleler ARRAY | City_name: "İstanbul", mahalleler: "Şehir Merkezi" |
şehir_adı ASC, mahalleler ARRAY | City_name: "İstanbul", mahalleler: "İstanbul" |
şehir_adı DESC, mahalleler ARRAY | City_name: "İstanbul", mahalleler: "İstanbul" |
şehir_adı DESC, mahalleler ARRAY | City_name: "İstanbul", mahalleler: "Şehir Merkezi" |
şehir_adı DESC, mahalleler ARRAY | City_name: "İstanbul", mahalleler: "İstanbul" |
Dizinler ve fiyatlandırma
Dizinler, uygulamanızın depolama maliyetlerine katkıda bulunur. Dizinler için depolama alanı boyutunu hesaplama hakkında daha fazla bilgi edinmek istiyorsanız Dizin girişi boyutu.
Dizin birleştirmeyi kullan
Cloud Firestore her sorgu için bir dizin kullansa da
her sorgu için bir dizin gerekir. Çoklu eşitliğe sahip sorgular için
(==
) deyimleri ve isteğe bağlı olarak orderBy
deyimi ile birlikte Cloud Firestore,
mevcut dizinleri yeniden kullanın. Cloud Firestore, basit işlemler için dizinleri birleştirebilir
daha büyük eşitlik için gereken bileşik dizinleri oluşturmak üzere eşitlik filtreleri
daha fazla bilgi edineceksiniz.
Dizin'i kullanabileceğiniz durumları tanımlayarak dizine ekleme maliyetlerini azaltabilirsiniz.
birleştiriliyor. Örneğin, bir restoran derecelendirme uygulamasının restaurants
koleksiyonunda:
restoran
hamburger
name : "Burger Thyme"
category : "burgers"
city : "San Francisco"
editors_pick : true
star_rating : 4
Bu uygulama, aşağıdaki gibi sorgular kullanır. Uygulama eşitlik kombinasyonları kullanıyor
category
, city
ve editors_pick
için ifadeler kullanarak her zaman sıralama ölçütü olarak kullanın
artan star_rating
:
Web
db.collection("restaurants").where("category", "==", "burgers") .orderBy("star_rating") db.collection("restaurants").where("city", "==", "San Francisco") .orderBy("star_rating") db.collection("restaurants").where("category", "==", "burgers") .where("city", "==", "San Francisco") .orderBy("star_rating") db.collection("restaurants").where("category", "==", "burgers") .where("city", "==" "San Francisco") .where("editors_pick", "==", true ) .orderBy("star_rating")
Her sorgu için bir dizin oluşturabilirsiniz:
Toplama | Dizine eklenen alanlar | Sorgu kapsamı |
---|---|---|
restoranlar | kategorisi, star_rating | Toplama |
restoranlar | şehir, yıldızlı değerlendirme | Toplama |
restoranlar | kategorisi, şehir, star_rating | Toplama |
restoranlar | kategorisi, şehir, editor_pick, star_rating | Toplama |
Daha iyi bir çözüm olarak, denemenizin sayısını azaltabilirsiniz. Cloud Firestore dizininin birleştirme özelliğinden yararlanarak dizin sayısını eşitlik ifadeleri için dizinler:
Toplama | Dizine eklenen alanlar | Sorgu kapsamı |
---|---|---|
restoranlar | kategorisi, star_rating | Toplama |
restoranlar | şehir, yıldızlı değerlendirme | Toplama |
restoranlar | editörleri_seç, yıldız_derecelendirmesi | Toplama |
Bu dizin grubu hem daha küçüktür hem de ek bir sorguyu destekler:
Web
db.collection("restaurants").where("editors_pick", "==", true) .orderBy("star_rating")
Dizine ekleme sınırları
Dizinler için aşağıdaki sınırlar geçerlidir. Kotalar ve sınırlar hakkında daha fazla bilgi için Kotalar ve Sınırlar.
Sınır | Ayrıntılar |
---|---|
Bir veritabanı için maksimum birleşik dizin sayısı |
|
Bir veritabanı için maksimum tek alanlı yapılandırma sayısı |
Tek alan düzeyinde yapılandırma aynı alan için birden fazla yapılandırma içerebilir. Örneğin, aynı alanda tek alanlı dizine ekleme muafiyeti ve TTL politikası bir alan yapılandırması olarak sayılır. |
Her belge için maksimum dizin girişi sayısı |
40.000 Belgelerde dizin girişlerinin sayısı, aşağıdakilerin toplamına eşittir:
Cloud Firestore uygulamasının bir dokümanı ve bir dizi öğeyi nasıl çevirdiğini görmek için dizin girişlerinde dizine eklenir, bkz. buradaki dizin girişi sayısı örneğini inceleyin. |
Bileşik dizindeki maksimum alan sayısı | 100 |
Dizin girişinin maksimum boyutu |
7,5 KiB Cloud Firestore uygulamasının dizin girişi boyutunu nasıl hesapladığını öğrenmek için şuraya bakın: dizin girişi boyutu. |
Bir belgenin dizin girişlerinin maksimum toplam boyutu |
8 MiB Belgelerdeki toplam boyut, aşağıdakilerin toplamına eşittir: |
Dizine eklenen alan değerinin maksimum boyutu |
1.500 bayt Boyutu 1.500 baytı aşan alan değerleri kısaltılır. Kısaltılmış alan değerleri içeren sorgular tutarsız sonuçlar verebilir. |
Dizine eklemeyle ilgili en iyi uygulamalar
Çoğu uygulama için otomatik dizine ekleme işlevini kullanabilirsiniz. Hata mesajında nasıl yönetebileceğinizi öğreneceksiniz. Ancak tek alan muafiyetini, şu durumlardan biridir:
Durum | Açıklama |
---|---|
Geniş dize alanları | Genellikle kullanırsanız, alanı muaf tutarak depolama maliyetlerini azaltabilirsiniz. olabilir. |
Sıralı değerleri olan belgeler içeren bir koleksiyona yüksek yazma hızları | Bir alanı dizine eklemede bir bir zaman damgası gibi, bir koleksiyondaki dokümanların maksimum toplama işlemi saniyede 500 yazmadır. Sıralı değerlere sahip alana göre sorgulama yapmazsanız alanı muaf tutabilirsiniz. dizine eklenmesini engelleyebilirsiniz. Örneğin, yazma hızı yüksek olan bir IoT kullanım alanında, zaman damgası alanı olan belgeler içeren bir koleksiyon, saniyede 500 yazma sınırına yaklaşabilir. |
TTL alanları |
TTL (geçerlilik süresi) politikalarını kullanıyorsanız TTL'nin alanına bir zaman damgası girilmelidir. TTL alanlarında dizine ekleme varsayılan olarak etkindir ve performansı daha yüksek trafik oranlarında etkiler. En iyi uygulama olarak, tek alan muafiyeti vardır. |
Büyük dizi veya eşleme alanları | Büyük dizi veya eşleme alanları,belge başına 40.000 dizin girişi sınırına yaklaşabilir. Geniş bir diziye veya eşleme alanına dayalı sorgulama yapmıyorsanız dizine ekleme işleminden muaf tutmanız gerekir. |
Birden çok alanda aralık ve eşitsizlik operatörleri içeren sorgular kullanıyorsanız dizine ekleme dikkate almanız gereken hususların Cloud Firestore sorgunun performansı ve maliyeti
Dizine ekleme sorunlarının (dizin dağılması, INVALID_ARGUMENT
hataları) nasıl giderileceği hakkında daha fazla bilgi için sorun giderme sayfasına bakın.