在Firebase Firestore集合中创建新文档时,如何更新另一个文档中的数量?

时间:2019-11-24 17:40:08

标签: node.js firebase google-cloud-firestore google-cloud-functions

当我在便笺集中创建一个新文档时,我想更新信息文档中的数量。我在做什么错了?

exports.addNote = functions.region('europe-west1').firestore
  .collection('users/{userId}/notes').onCreate((snap,context) => {
    const uid = admin.user.uid.toString();
    var t;
  db.collection('users').doc('{userId}').collection('info').doc('info').get((querySnapshot) => {
    querySnapshot.forEach((doc) => {
      t = doc.get("countMutable").toString();
    });
  });
  let data = {
    countMutable: t+1;
  };
  db.collection("users").doc(uid).collection("info").doc("info").update({countMutable: data.get("countMutable")});
});

1 个答案:

答案 0 :(得分:1)

您...这里发生了很多事情。一些问题:

  • 您无法在集合上触发firestore功能,必须提供文档。
  • 目前尚不清楚您是否一致对待用户ID。
  • 您不是using promises properly(需要链接它们,如果希望它们正确执行,则将它们从函数中返回)。
  • 我不清楚userId上下文参数和您从auth对象获得的uid之间的关系。据我所知,admin.user实际上不是Admin SDK的一部分。
  • 由于您没有使用事务或increment操作,因此冒着多个函数调用同时执行增量操作的风险。 (Learn More Here
  • 如果文档不存在,则不会创建。也许可以吗?

简而言之,这一切都意味着您可以更简单地完成此操作。

这应该可以帮助您。我假设您实际上想要的uid实际上是触发更新的文档上的那个。如果没有,请根据需要进行调整。

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

const db = admin.firestore();

exports.addNote = functions.firestore.document('users/{userId}/notes/{noteId}').onCreate((snap,context) => {
    const uid = context.params.userId;
    return db.collection("users").doc(uid).collection("info").doc("info").set({
      countMutable: admin.firestore.FieldValue.increment(1)
    }, { merge: true });
});

如果不想创建info文档(如果它不存在),而想得到一个错误,可以使用update而不是set

    return db.collection("users").doc(uid).collection("info").doc("info").update({
      countMutable: admin.firestore.FieldValue.increment(1)
    });