2017-10-03 15 views
5

Można policzyć, ile elementów kolekcja używa nowej bazy danych firewall, firewall?Liczba kolekcji firewalli Firebase

Jeśli tak, jak mogę to zrobić?

+6

Możliwy duplikat [Jak uzyskać liczbę dokumentów w kolekcji w Cloud Firestore] (https://stackoverflow.com/questions/46553314/how-to -get-a-liczba-dokumentów-w-kolekcji-w-chmurze-firestore) –

Odpowiedz

0

O ile mi wiadomo, nie ma w tym celu wbudowanego rozwiązania i jest to teraz możliwe tylko w węźle sdk. Jeśli masz

db.collection ('someCollection')

można użyć

.Wybrać pola ([])

aby określić, które pola chcesz wybrać. Jeśli zrobisz pusty select(), po prostu otrzymasz tablicę odniesień do dokumentów.

przykład:

db.collection('someCollection').select().get().then( (snapshot) => console.log(snapshot.docs.length) );

To rozwiązanie jest tylko optymalizacja dla najgorszego przypadku pobierania wszystkie dokumenty i nie skalować na dużych zbiorów!

Mają również spojrzeć na to:
How to get a count of number of documents in a collection with Cloud Firestore

1

Nie, nie ma wbudowanego wsparcia dla kwerend agregujących teraz. Jest jednak kilka rzeczy, które możesz zrobić.

Pierwsza to documented here. Za pomocą transakcji lub funkcji chmurowych można przechowywać informacje zbiorcze:

Ten przykład pokazuje, jak korzystać z funkcji, aby śledzić liczbę ocen w podkolektorach, a także średnią ocenę.

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 
     }); 
     }); 
    }); 
}); 

Rozwiązanie, o którym wspomniał jbb, jest również użyteczne, jeśli chcesz tylko liczyć dokumenty sporadycznie. Upewnij się, że używasz instrukcji select(), aby uniknąć pobierania wszystkich dokumentów (to dużo przepustowości, gdy potrzebujesz tylko liczby). select() jest teraz dostępny tylko w pakietach SDK na serwerze, aby rozwiązanie nie działało w aplikacji mobilnej.

3

Najprostszym sposobem zrobienia tego jest odczytanie rozmiaru "querySnapshot".

db.collection("cities").get().then(function(querySnapshot) {  
    console.log(querySnapshot.size); 
}); 

Możesz również odczytać długość tablicy docs wewnątrz "querySnapshot".

querySnapshot.docs.length; 

Lub jeśli "querySnapshot" jest pusty, odczytując pustą wartość, która zwróci wartość logiczną.

querySnapshot.empty; 
+3

Pamiętaj, że każdy dokument "kosztuje" jeden odczyt.Jeśli w ten sposób policzysz 100 przedmiotów w kolekcji, zostanie naliczona opłata za 100 odczytów! – Georg

+0

Prawidłowo, ale nie ma innego sposobu na zsumowanie liczby dokumentów w kolekcji. A jeśli już pobrałeś kolekcję, odczytanie tablicy "docs" nie będzie wymagało więcej pobierania, więc nie będzie "kosztować" więcej odczytów. – Ompel

+0

To czyta wszystkie dokumenty w pamięci! Powodzenia w tym dla dużych zbiorów danych ... –