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 中),有两种方法:
读取整个现有数组,然后向其追加新数据,最后,使用修改后的数组更新文档。显然,如果您希望数组中有很多项,这不是一个可扩展的解决方案。
使用 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
编辑以包含发帖人为其他读者找到的解决方案。
我目前正在做一个 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 中),有两种方法:
读取整个现有数组,然后向其追加新数据,最后,使用修改后的数组更新文档。显然,如果您希望数组中有很多项,这不是一个可扩展的解决方案。
使用 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
编辑以包含发帖人为其他读者找到的解决方案。