【问题标题】:Firestore Add value to array fieldFirestore 将值添加到数组字段
【发布时间】:2018-06-22 06:03:09
【问题描述】:

我正在尝试使用 Firebase 云功能将聊天室的 ID 添加到数组字段中的用户文档中。我似乎无法弄清楚写入数组字段类型的方法。这是我的云功能

  exports.updateMessages = functions.firestore.document('messages/{messageId}/conversation/{msgkey}').onCreate( (event) => {
    console.log('function started');
    const messagePayload = event.data.data();
    const userA = messagePayload.userA;
    const userB = messagePayload.userB;   

        return admin.firestore().doc(`users/${userA}/chats`).add({ event.params.messageId }).then( () => {

        });

  });

这是我的数据库的外观

非常感谢任何提示,我是 Firestore 的新手。

【问题讨论】:

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


【解决方案1】:

从文档中,他们添加了一个新操作来添加或删除数组中的元素。在这里阅读更多:https://firebase.google.com/docs/firestore/manage-data/add-data#update_elements_in_an_array

例子:

var admin = require('firebase-admin');
// ...
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')
});
// Atomically remove a region from the "regions" array field.
var arrRm = washingtonRef.update({
  regions: admin.firestore.FieldValue.arrayRemove('east_coast')
});

【讨论】:

  • 注意FieldValue方法的细节。
  • arrayUnion 只会添加不存在的元素。有没有办法添加项目而不考虑重复项?
  • 如何使用事务进行上述操作?
  • 在该路径上需要 update 权限
  • @FirefoxMetzger 如果数组包含多个字段怎么办
【解决方案2】:

Firestore 目前不允许您更新数组的各个字段。但是,您可以像这样替换数组的全部内容:

admin.firestore().doc(`users/${userA}/chats`).update('array', [...]);

请注意,这可能会覆盖来自其他客户端的某些写入。您可以在执行更新之前使用事务来锁定文档。

admin.firestore().runTransaction(transaction => {
  return transaction.get(docRef).then(snapshot => {
    const largerArray = snapshot.get('array');
    largerArray.push('newfield');
    transaction.update(docRef, 'array', largerArray);
  });
});

【讨论】:

  • 注意 const largeArray 会在“push”操作后转换为与array.length相关的数字。正确的方法是创建数组的引用,然后推送,然后使用该引用更新事务: const largeArray = snapshot.get('array'); largeArray.push('newField')
  • 这个答案不再正确。此功能存在。 Firebase 文档:firebase.google.com/docs/firestore/manage-data/…
【解决方案3】:

这是 2021 年,经过 Firebase Firestore 的多次更新,在数组中添加数据而不删除其他数据的新方法是

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

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

      // Atomically remove a region from the "regions" array field.
    washingtonRef.update({
        regions: firebase.firestore.FieldValue.arrayRemove("east_coast")
      });

【讨论】:

    猜你喜欢
    • 2020-04-25
    • 1970-01-01
    • 1970-01-01
    • 2020-08-09
    • 2018-12-22
    • 2014-05-18
    • 2019-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多