Firestore 将值添加到数组字段

Posted

技术标签:

【中文标题】Firestore 将值添加到数组字段【英文标题】:Firestore Add value to array field 【发布时间】: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 的新手。

【问题讨论】:

Append to array Firebase的可能重复 【参考方案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")
      );

【讨论】:

以上是关于Firestore 将值添加到数组字段的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 SwiftUI 将值数组写入 Firestore

angularjs将值附加到内部数组中

将值和数组添加到 PDO 执行方法

Android Studio Firebase Firestore 无法检索字段数据

我想将对象列表添加到 Firestore 文档,-颤动

Jquery:将值数组从一个数组输入传递到另一个数组输入字段