如何在Firestore文档内的数组中添加元素?

时间:2019-04-20 20:45:46

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

我在Firestore函数和数据库中是新手,所以有点卡住了。我有这份文件:

Database Document

如您所见,现在在一个空数组中回答,但我将有一堆字符串。

问题是我正在使用的Cloud Function失败。这是我的功能

exports.registerUserResponse = functions.https.onRequest((request, response) => {

    const original = request.body;
    const type_form_id = original.form_response.form_id

    var userRef = admin.firestore().collection('users').doc(user_email);

    var transaction = admin.firestore().runTransaction(t => {
        return t.get(userRef)
          .then(doc => {
            console.log(doc.data());
            var newAnswer = doc.data().answers.arrayUnion(type_form_id);
            t.update(userRef, {answers: newAnswer});
          });
    }).then(result => {
        //return response.status(200).send();
        return response.status(200).json({result: `Message added.`}).send();
    }).catch(err => {
        console.log(err);
        return response.status(500).json({result: `Message: ${err} error.`}).end();
    });

所有值都可以,但是我在arrayUnion函数上遇到此错误

TypeError: Cannot read property 'arrayUnion' of undefined
at t.get.then.doc (/user_code/index.js:27:58)
at process._tickDomainCallback (internal/process/next_tick.js:135:7)

因此,我不知道该如何使用该功能。感谢您的任何答案!

1 个答案:

答案 0 :(得分:1)

arrayUnion不是可从Firestore查询取回的任何数据项上存在的方法。在doc.data().answers中获得的undefined值绝对不可用。

您似乎对如何使用FieldValue.arrayUnion()感到困惑。您不需要交易就可以使用它。只需按照documentation中所述执行更新:

var washingtonRef = db.collection('cities').doc('DC');

// Atomically add a new region to the "regions" array field.
var arrUnion = washingtonRef.update({
  regions: admin.firestore.FieldValue.arrayUnion('greater_virginia')
});

您可能看起来像这样:

admin.firestore().collection('users').doc(user_email).update({
    answers: admin.firestore.FieldValue.arrayUnion(type_form_id)
}).then(...);