Пожарная транзакция обновить несколько документов - PullRequest
0 голосов
/ 27 февраля 2019

Я хочу обновить документы в одной коллекции.

my_collection
     document_1
        field_1
        field_2
     document_2
        field_1
        field_2

Мой код:

exports.aggregateUsers = 
functions.firestore.document('users/{userId}').onWrite(function(change, 
context) {
const document = change.after.exists ? change.after.data() : null;
const oldDocument = change.before.data() || null;

return firestore.runTransaction(function(transaction) {
    var oldInstanceRef;
    var instanceRef;

    var oldInstanceDoc;
    var instanceDoc;
    if (document != null) {
        instanceRef = firestore.collection("counters").doc("instance_counter").collection("instances").doc(document.instance);
        instanceDoc = transaction.get(instanceRef);

        var newNumberOfUsers = (instanceDoc.data().number_of_users || 0) + 1;
        transaction.set(instanceRef, { number_of_users: newNumberOfUsers });
    } 
    if (oldDocument != null) {
        oldInstanceRef = firestore.collection("counters").doc("instance_counter").collection("instances").doc(oldDocument.instance);
        oldInstanceDoc = transaction.get(oldInstanceRef);

        var newPrevNumberOfUsers = (oldInstanceDoc.data().number_of_users || 0) + 1;
        transaction.set(instanceRef, { number_of_users: newPrevNumberOfUsers });
    }


}).catch(function(error) {
    console.log("invalid-argument", error.code, error.message);
});
});

Ошибки:

instanceDoc.data is not a function

Я использую транскрипцию в облакефункция агрегирования количества пользователей, не использующих распределенный счетчик, из-за низкого трафика приложения.У меня вопрос, как обновить значение поля в каждом документе?Спасибо

1 Ответ

0 голосов
/ 29 мая 2019

Полагаю, вы забыли асинхронное / ожидание.

Попробуйте:

  1. async до transaction параметр
  2. await до transaction.get(<some_ref_here>)

return firestore.runTransaction(async transaction => {
    var oldInstanceRef;
    var instanceRef;

    var oldInstanceDoc;
    var instanceDoc;
    if (document != null) {
        instanceRef = firestore.collection("counters").doc("instance_counter").collection("instances").doc(document.instance);
        instanceDoc = await transaction.get(instanceRef);

        var newNumberOfUsers = (instanceDoc.data().number_of_users || 0) + 1;
        transaction.set(instanceRef, { number_of_users: newNumberOfUsers });
    } 
    if (oldDocument != null) {
        oldInstanceRef = firestore.collection("counters").doc("instance_counter").collection("instances").doc(oldDocument.instance);
        oldInstanceDoc = await transaction.get(oldInstanceRef);

        var newPrevNumberOfUsers = (oldInstanceDoc.data().number_of_users || 0) + 1;
        transaction.set(instanceRef, { number_of_users: newPrevNumberOfUsers });
    }


}).catch(function(error) {
    console.log("invalid-argument", error.code, error.message);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...