Yeni Firebase veritabanı Cloud Firestore'u kullanarak bir koleksiyonda kaç öğe olduğunu saymak mümkün mü?
Eğer öyleyse, bunu nasıl yapabilirim?
Bunu yapmanın en basit yolu bir "querySnapshot" boyutunu okumaktır.
db.collection("cities").get().then(function(querySnapshot) {
console.log(querySnapshot.size);
});
docs dizisinin uzunluğunu "querySnapshot" içinde de okuyabilirsiniz.
querySnapshot.docs.length;
Veya bir "querySnapshot" boşsa, boolean değeri döndürecek olan boş değeri okuyarak.
querySnapshot.empty;
Bildiğim kadarıyla bunun için yerleşik bir çözüm yok ve şu anda sadece node sdk'da mümkün. Eğer bir
db.collection('someCollection')
kullanabilirsin
.select([alanlar])
hangi alanı seçmek istediğinizi tanımlamak için. Boş bir select() yaparsanız, sadece bir dizi belge referansı alırsınız.
Örnek:
db.collection('someCollection').select().get().then( (snapshot) => console.log(snapshot.docs.length) );
Bu çözüm yalnızca tüm belgelerin indirildiği en kötü durum için bir optimizasyondur ve büyük koleksiyonlarda ölçeklenmez!
Ayrıca şuna da bir göz atın:
https://stackoverflow.com/questions/46553314/how-to-get-a-count-of-number-of-documents-in-a-collection-with-cloud-firestore
Hayır, şu anda toplama sorguları için yerleşik bir destek yok. Ancak yapabileceğiniz birkaç şey var.
İlki burada belgelenmiştir. Toplu bilgileri korumak için işlemleri veya bulut işlevlerini kullanabilirsiniz:
Bu örnekte, bir alt koleksiyondaki derecelendirme sayısının yanı sıra ortalama derecelendirmeyi takip etmek için bir fonksiyonun nasıl kullanılacağı gösterilmektedir.
exports.aggregateRatings = firestore
.document('restaurants/{restId}/ratings/{ratingId}')
.onWrite(event => {
// Get value of the newly added rating
var ratingVal = event.data.get('rating');
// Get a reference to the restaurant
var restRef = db.collection('restaurants').document(event.params.restId);
// Update aggregations in a transaction
return db.transaction(transaction => {
return transaction.get(restRef).then(restDoc => {
// Compute new number of ratings
var newNumRatings = restDoc.data('numRatings') + 1;
// Compute new average rating
var oldRatingTotal = restDoc.data('avgRating') * restDoc.data('numRatings');
var newAvgRating = (oldRatingTotal + ratingVal) / newNumRatings;
// Update restaurant info
return transaction.update(restRef, {
avgRating: newAvgRating,
numRatings: newNumRatings
});
});
});
});
Jbb'nin bahsettiği çözüm, belgeleri yalnızca seyrek olarak saymak istiyorsanız da kullanışlıdır. Her belgenin tamamını indirmekten kaçınmak için select()
deyimini kullandığınızdan emin olun (yalnızca bir sayıma ihtiyacınız olduğunda bu çok fazla bant genişliği demektir). select()` şimdilik sadece sunucu SDK'larında mevcuttur, bu nedenle bu çözüm bir mobil uygulamada çalışmayacaktır.