2

lässt sagen, ich habe eine App, die Benutzer Rechnungen speichert, Benutzer fügt hinzu oder löscht die Rechnung. die Struktur der Daten ist als:Firestore Cloud-Funktionen zum Abrufen aggregierter Werte in Sammlung

users/user_id/bills/bill_id 

Rechnung Dokumentstruktur als

{ bill_name: string, amount: number } 

was ich die Benutzer aggregierten Werte anzeigen möchten entsprechenden Namen in Rechnung können sagen, dass ich zwei Einträge in Rechnungen Sammlung

{ bill_name: 'amazon', amount: 1000 } 
{ bill_name: 'amazon', amount: 2000 } 

sollte mein ausgegeben werden

{ bill_name: 'amazon', amount: 3000 } 

meine Frage ist, was am besten sein wird, die aggregierten Werte

  1. Erstellen einer Cloud-Funktion, die OnWrite/user/user_id/bills/bill_id auf löst zu erhalten und einen neuen Eintrag in /users/user_id/aggregated_bills/ zum Zeitpunkt Benutzer erstellen hinzufügt oder löscht die Rechnungen und was diese Funktion liest die Daten von /users/user_id/aggregated_bills/bill_id/, wo Rechnungsname ist "Amazon" add tun die Mathematik zu diesem Eintrag und speichern Sie den neuen Wert in aggregated_bills Sammlung. Ich möchte auch wissen, ob wir die Datenbank aus anderen Cloud-Funktion hinzufügen oder lesen können, dann wurde darauf verwiesen. in functions.firestore.document('/users/{user_id}/bills/{bill_id}').onWrite(...

  2. eine Wolke Funktion erstellen, die auf HTTPS-Anforderung auslöst, und lesen die Daten aus dem /users/user_id/bills/ Rechnung name ‚Amazon‘ und berechnen die aggregierte Werte gibt, und gibt die Antwort ist.

  3. kann jede andere Lösung für dieses Problem sein

hier möchte ich sagen, dass aggregierte Werte nicht immer nur für eine Rechnung sein wird, aber für mehrere Rechnungen zur gleichen Zeit. können sagen, dass ich zu dem Benutzer Armaturenbrett angezeigt werden soll, wo er aggregierten Werte seiner Top 20 Rechnungen

Antwort

2

Der onWrite Auslöser sehen die meisten Sinn in dieser Situation machen würde. Erwägen Sie, die Aggregat-Ergebnisse als Objekt/Map in das übergeordnete Dokument zu schreiben, da Sie dann nur eine Leseoperation benötigen, um die Daten zu konsumieren - schneller und billiger.

Ihre Cloud-Funktion würde wie folgt aussehen:

exports.aggregateBills = functions.firestore 
    .document('user/{user_id}/bills/{bill_id}') 
    .onWrite(event => { 

    const bill_id = event.params.bill_id; 
    const user_id = event.params.user_id; 

    const bill_name = event.data.data().bill_name; 

    // ref to the parent document 
    const docRef = admin.firestore().collection('users').doc(userId) 

    // get all bills and aggregate 
    return docRef.collection('bills') 
     .where('bill_name', '==', bill_name) 
     .get() 
     .then(querySnapshot => { 
      // get the total comment count 

      const bills = [] 
      // loop over bills to create a plain JS array 
      querySnapshot.forEach(doc => { 
       bills.push(doc.data()) 
      }); 

      const aggregateData = 'do your calculations here' 


      // run update 
      return docRef.update({ aggregateData }) 
     }) 
}); 
+0

+1 Auf dieser aggregierten Daten schreiben in NoSQL-Lösungen durchaus üblich ist und Cloud-Funktionen sind ein großes Werkzeug für solche Operationen zu tun. Eine Alternative besteht darin, die Aggregation clientseitig zu machen (wie Sie die Rechnungen hinzufügen), aber das erfordert ziemlich knifflige Sicherheitsregeln, um sicherzustellen, dass böswillige Benutzer keine ungültigen Schreibvorgänge ausführen können. Da Cloud-Funktionen in einer vertrauenswürdigen Umgebung ausgeführt werden, müssen Sie sich keine Sorgen darüber machen, dass jemand seinen eigenen Aggregationscode schreibt, der gegen Ihre Geschäftsregeln verstößt. –

Verwandte Themen