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 将值添加到数组字段的主要内容,如果未能解决你的问题,请参考以下文章