Firebase 云函数试图将用户数据合并到一个数组中

Firebase cloud function trying to merge users data into an array

我目前正在做一个 React-Native 项目。 我正在使用 Firebase 构建应用程序。 让我们将其归类为社交媒体应用。

使用 firebase 云功能,我正在尝试将所有用户放入一个文档中。 为此,使用 onCreate 事件,我会监听集合“用户”中创建的每个新文档,每次创建新用户时,我都会获取他的所有信息并将其放入集合“聚合”中的另一个文档中。给这棵树“aggregation/users”。

这是我的代码:

exports.aggregateNewUsers = functions.firestore
    .document('users/{userId}')
    .onCreate( (snapshot, context) => {

        const newUser = snapshot.data()
const aggUsersRef = db.doc('aggregation/users')

        return aggUsersRef.set({
users: [newUser]} 
, {merge: true})

    })

有了这个,我希望每个新用户都添加到用户字段(一个数组)中。 我正在使用合并选项来这样做。但是,也许是因为我试图将它与数组一起使用,它不起作用,而不是保留旧数据并将其与新数据合并,而是在每次创建新用户时简单地替换它。 我也尝试使用 mergeFields 选项但没有成功,因为它会引发错误。

有没有办法让它起作用?

感谢您的宝贵时间!

使用数组可能很棘手。在这里,'merge' 并不意味着'append',它意味着替换(或添加)作为传递对象一部分的属性的值并保留文档的其余部分。由于您传递的对象具有现有 属性(用户),因此 属性 的值将被替换。

要在数组字段中附加一个项目(在 Cloud Firestore 中),有两种方法:

  1. 读取整个现有数组,然后向其追加新数据,最后,使用修改后的数组更新文档。显然,如果您希望数组中有很多项,这不是一个可扩展的解决方案。

  2. 使用 Firebase ArrayUnion 方法

     aggUsersRef.update({
         users: firebase.firestore.FieldValue.arrayUnion(newUser)
     });
    

根据 Firebase Cloud Firestore 文档:

"如果您的文档包含数组字段,您可以使用 arrayUnion() 和 arrayRemove() 添加和删除元素。 arrayUnion() 将元素添加到数组中,但仅添加不存在的元素。arrayRemove() 删除每个给定元素的所有实例。” https://firebase.google.com/docs/firestore/manage-data/add-data

编辑以包含发帖人为其他读者找到的解决方案。