Как обновить документ в облачной функции Firebase - PullRequest
0 голосов
/ 13 января 2019

В своей облачной функции я хочу обновить свой документ из коллекции «приборной панели», когда новый студент будет добавлен в коллекцию «студентов».

const getActiveStudents = () => {
return db.collection('/students/').where('status', '==', true).get().then(
    snapshot => {
        let studentsCount = snapshot.docs.length;
        db.collection('/dashboard/').where('type', '==', 'students').get().then(
            result => {
                if (result.docs.length === 0) {
                    db.collection('dashboard').add({
                        count: studentsCount,
                        type: 'students',
                        label: 'Active students'
                    });
                }else {
                    result.docs[0].ref.update({
                        count: studentsCount,
                        type: 'students',
                        label: 'Active students'
                    });
                }
                return result;
            }
        ).catch(error => {
            console.log(error);
        });
        return snapshot;
    }
).catch(error => {
    console.log(error);
})
}

exports.onChangesInStudents = functions.firestore.document('/students/{studentId}').onWrite(event => {
    getActiveStudents();
    return;
});

Когда я добавляю нового учащегося, вместо обновления документа он добавляет новый документ в мою коллекцию панели инструментов. Как мне организовать свой код, чтобы правильно обновлять количество учеников.

enter image description here

1 Ответ

0 голосов
/ 25 января 2019

как упоминал @Doug, итерации по всей коллекции слишком тяжелые. вместо этого вы можете передавать результаты запроса и перебирать ключи, используя query.stream () .

для доступа и обновления одного поля в документе, сначала получите документ по его идентификатору с помощью doc () , затем используйте update () при указании поля.

Вот пример реализации на основе вашего сценария.

package.json

{
  "dependencies": {
    "firebase-admin": "^6.5.1",
    "firebase-functions": "^2.1.0"
  }
}

index.js

const functions = require('firebase-functions');
const admin = require('firebase-admin');

admin.initializeApp(functions.config().firebase);

const studentsRef = admin.firestore().collection('students');
const dashboardRef = admin.firestore().collection('dashboard');

exports.addStudent = functions.firestore
  .document('students/{studentId}')
  .onCreate((snap, context) => {
    var newStudent = snap.data();
    console.log('New student in collection: ', newStudent);

    var activeCount = 0;
    studentsRef.where('status', '==', true).select().stream()
      .on('data', () => {
        ++activeCount;     
      }).on('end', () => { 
        dashboardRef.where('type', '==', 'students').get()
          .then(querySnap => {
            if (querySnap.docs[0].data().count == activeCount){
              console.log('No new active student: ', querySnap.docs[0].data());
            } else {
                console.log('New active count: ', activeCount);
                console.log('Student Dashboard before update: ', querySnap.docs[0].id, '=>', querySnap.docs[0].data());
                dashboardRef.doc(querySnap.docs[0].id).update({
                  count: activeCount
                });
                console.log('Active student count updated: ', querySnap.docs[0].data().count, '=>', activeCount);
              };
            });
        });
  return null
  });

gcloud

gcloud functions deploy addStudent \
  --runtime nodejs8 \
  --trigger-event providers/cloud.firestore/eventTypes/document.create \
  --trigger-resource "projects/[PROJECT_ID]/databases/(default)/documents/students/{studentId}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...