3 回答
TA贡献1777条经验 获得超10个赞
Firebase 具有push()将子节点添加到列表的内置操作的原因有很多。事实上,您已经在问题中听到了其中之一:
检索列表以更新它似乎效率低下
其他原因是推送 ID 在您的应用处于离线状态时仍然有效,并且它们可以在多个用户之间更好地扩展。
如果您想详细了解为什么应该使用push(),请阅读最佳实践:Firebase 中的数组。
TA贡献1786条经验 获得超13个赞
首先,您可以使用以下代码生成唯一键
const newID = firebase.database.ref().push().key
根据此答案,每当您对数据库引用使用推送时,都会使用包含服务器时间戳的唯一键生成一个新数据节点。这些键看起来像 -KiGh_31GA20KabpZBfa。
由于时间戳的存在,您可以确定给定的键是唯一的,而无需检查数据库中的其他键。
其次,您可以使用 将项目添加到数据库中的列表中transaction。
const newID = firebase.database.ref().push().key
//user is user object from firebase auth module
const newDatabaseRouteRef = firebase.database.ref().child('users/' + user.uid + '/ids')
// if null, create a new list with id, if not add newID to list
newDatabaseRouteRef.transaction((currentValue) => {
return currentValue ? currentValue.push(newID) : [newID]
})
TA贡献1155条经验 获得超0个赞
我正在创建另一个答案只是为了展示不同类型的解决方案。这个解决方案,使用push比使用更好transaction。
// Get a new ref by push
const newDatabaseRouteRef = firebase.database.ref().child('users/' + user.uid + '/routes').push()
// Set the value to the key of received ref
newDatabaseRouteRef.set(newDatabaseRouteRef.key)
这更好,因为
事务需要多次往返,而 push() 不需要,从而减少时间。
根据这篇文章更安全。
这实现了相同的结果,因为即使使用列表,当列表保存在 firebase 数据库中时,它也被存储为对象。 ex) ["a","b","c"] => {0:"a",1:"b",2:"c"}
添加回答
举报
