Açıklama
Bir dizi ifadenin tüm farklı değer kombinasyonlarını bulur.
distinct(...) aşaması, bir veya daha fazla seçilebilir ifade kullandığı için select(...) ile benzer bir söz dizimine sahiptir. Dizeler, ifade yalnızca bir alan referansı olduğunda kullanılabilir:
Örnekler
Node.js
let cities = await db.pipeline() .collection("cities") .distinct("country") .execute(); cities = await db.pipeline() .collection("cities") .distinct( field("state").toLower().as("normalizedState"), field("country")) .execute();
Web
let cities = await execute(db.pipeline() .collection("cities") .distinct("country")); cities = await execute(db.pipeline() .collection("cities") .distinct( field("state").toLower().as("normalizedState"), field("country")));
Swift
let results = try await db.pipeline() .collection("books") .distinct([ Field("author").toUpper().as("author"), Field("genre") ]) .execute()
Kotlin
var cities = db.pipeline() .collection("cities") .distinct("country") .execute() cities = db.pipeline() .collection("cities") .distinct( field("state").toLower().alias("normalizedState"), field("country") ) .execute()
Java
Task<Pipeline.Snapshot> cities; cities = db.pipeline() .collection("cities") .distinct("country") .execute(); cities = db.pipeline() .collection("cities") .distinct( field("state").toLower().alias("normalizedState"), field("country")) .execute();
Python
from google.cloud.firestore_v1.pipeline_expressions import Field cities = client.pipeline().collection("cities").distinct("country").execute() cities = ( client.pipeline() .collection("cities") .distinct(Field.of("state").to_lower().as_("normalizedState"), "country") .execute() )
Java
Pipeline.Snapshot cities1 = firestore.pipeline().collection("cities").distinct("country").execute().get(); Pipeline.Snapshot cities2 = firestore .pipeline() .collection("cities") .distinct(toLower(field("state")).as("normalizedState"), field("country")) .execute() .get();
Davranış
distinct(...) aşaması, gruplar içermeyen bir aggregate(...) aşamasına benzer şekilde çalışır. Ayrıca aggregate(...) ve select(...) politikalarını da inceleyin.
Farklı Alan Değerlerini Bulma
Örneğin, aşağıdaki cities koleksiyonundaki her ülkenin listesini almak için:
Node.js
await db.collection("cities").doc("SF").set({name: "San Francisco", state: "CA", country: "USA"});
await db.collection("cities").doc("LA").set({name: "Los Angeles", state: "CA", country: "USA"});
await db.collection("cities").doc("NY").set({name: "New York", state: "NY", country: "USA"});
await db.collection("cities").doc("TOR").set({name: "Toronto", state: null, country: "Canada"});
await db.collection("cities").doc("MEX").set({name: "Mexico City", state: null, country: "Mexico"});
Aşağıdaki yöntemleri kullanarak farklı ülkeleri bulabilirsiniz:
Node.js
const cities = await db.pipeline()
.collection("/cities")
.distinct("country")
.execute();
Bu işlem aşağıdaki sonucu üretir:
{ country: "USA" }
{ country: "Canada" }
{ country: "Mexico" }
İfadelerin Farklı Çıkışı
Ayrıca, birden fazla alanın farklı kombinasyonlarını veya daha karmaşık ifadeleri de bulabilirsiniz. Örneğin:
Node.js
const cities = await db.pipeline()
.collection("/cities")
.distinct(
field("state").toLower().as("normalized_state"),
field("country"))
.execute();
için:
{ country: "USA", normalized_state: "ca" }
{ country: "USA", normalized_state: "ny" }
{ country: "Canada", normalized_state: null }
{ country: "Mexico", normalized_state: null }
Eşdeğerlik Davranışları
Farklı değerlerdeki denklik davranışı, eşitliklerle aynı anlambilime sahiptir.
Bu, orijinal türlerden (32 bit tam sayı, 64 bit tam sayı, kayan nokta sayıları, ondalık sayılar vb.) bağımsız olarak matematiksel olarak eşdeğer sayısal değerler gibi eşdeğer değerlerin aynı farklı değer olarak kabul edildiği anlamına gelir.
Örneğin, numerics koleksiyonunda sırasıyla 32 bit tamsayı 1, 64 bit tamsayı 1L ve kayan nokta 1.0 değerlerini içeren farklı belgeler varsa distinct(...) yalnızca 1 sonuç döndürür.foo
Veri kümesinde farklı eşdeğer değerlerin bulunduğu bu gibi durumlarda, grubun çıkış değeri bu eşdeğer değerlerden herhangi biri olabilir.
Bu örnekte, foo değeri 1, 1L veya 1.0 olarak döndürülebilir.
Belirleyici gibi görünse bile, belirli bir değerin seçilme davranışına güvenmeye çalışmamalısınız.
Bellek Kullanımı
distinct(...) aşamasının nasıl yürütüleceği, kullanılabilir dizinlere bağlıdır. Sorgu iyileştirici tarafından uygun bir dizin seçilmediğinde distinct(...), bellekteki tüm farklı değerlerin arabelleğe alınmasını gerektirir.
Çok sayıda farklı değer olması veya değerlerin çok büyük olması (ör. büyük değerlerde farklılık) durumunda bu aşamada bellek yetersiz kalabilir.
Bu gibi durumlarda, üzerinde işlem yapılacak veri kümesini sınırlamak için filtreler uygulamanız veya büyük bellek kullanımlarını önlemek için önerildiği şekilde dizinler oluşturmanız gerekir.distinct(...)
Sorgu Açıklama, hata ayıklamaya yardımcı olmak için gerçek sorgu yürütme planı ve profil oluşturma verileri hakkında bilgi sağlar.