Javascript 反应+;Firebase:如何将列表数据项添加到Firebase实时数据库中

Javascript 反应+;Firebase:如何将列表数据项添加到Firebase实时数据库中,javascript,reactjs,firebase,firebase-realtime-database,Javascript,Reactjs,Firebase,Firebase Realtime Database,我正在使用react和firebase实时数据库。我想为每个用户创建一个列表。用于以后在存储器中查找文件的id列表。在这种情况下,生成id并将其添加到数据库列表中的最佳方法是什么?(不是数据列表,数据库中存储的数据是列表) 所以我想有两种方法。我将用伪代码编写 //Method 1 //get id list receivedList = getKeyListFromDB() //generate ID newID = generateID() // append new id received

我正在使用react和firebase实时数据库。我想为每个用户创建一个列表。用于以后在存储器中查找文件的id列表。在这种情况下,生成id并将其添加到数据库列表中的最佳方法是什么?(不是数据列表,数据库中存储的数据是列表)

所以我想有两种方法。我将用伪代码编写

//Method 1
//get id list
receivedList = getKeyListFromDB()
//generate ID
newID = generateID()
// append new id
receivedList.append(newID)
//set value with updated list
updateDB(receivedList)

//Method 2
// Using the list provided by the firebase
newRef = firebase.database().ref().child('pathToList').push()
newRef.set({
      key: newRef.key
    })
我打算使用方法1,但找不到生成id的方法。检索列表以更新它似乎效率低下。所以我试着找到另一种方法。但我找不到好办法

向数据库中的列表添加值的解决方案


我已经用事务处理方法解决了。但如果有办法通过使用
push
解决问题,请务必回答

Firebase具有内置的
push()
操作以将子节点添加到列表中的原因有很多。事实上,在你的问题中,你已经听过其中一个:

检索列表以更新它似乎效率低下

其他原因是推送ID在你的应用程序离线时可以工作,而且它们在多个用户之间的伸缩性更好


如果您想了解更多关于为什么要使用
push()
,请阅读。

Firebase具有内置
push()
操作以将子节点添加到列表的原因有很多。事实上,在你的问题中,你已经听过其中一个:

检索列表以更新它似乎效率低下

其他原因是推送ID在你的应用程序离线时可以工作,而且它们在多个用户之间的伸缩性更好


如果您想进一步了解为什么要使用
push()
,请阅读。

首先,您可以使用以下代码生成唯一密钥

const newID = firebase.database.ref().push().key
根据,每当在数据库引用上使用push时,都会生成一个新的数据节点,其中包含一个包含服务器时间戳的唯一键。这些钥匙看起来像-kigh31ga20kabpzbfa

由于时间戳,您可以确保给定的密钥是唯一的,而不必检查数据库中的其他密钥

其次,您可以使用
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]
})
// 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)

首先,您可以使用下面的代码生成一个唯一的密钥

const newID = firebase.database.ref().push().key
根据,每当在数据库引用上使用push时,都会生成一个新的数据节点,其中包含一个包含服务器时间戳的唯一键。这些钥匙看起来像-kigh31ga20kabpzbfa

由于时间戳,您可以确保给定的密钥是唯一的,而不必检查数据库中的其他密钥

其次,您可以使用
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]
})
// 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
比使用
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]
})
// 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”}

    我创建另一个答案只是为了展示不同类型的解决方案。此解决方案使用
    push
    比使用
    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]
    })
    
    // 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”}