【问题标题】:Firebase Database replace user id Cloud FunctionFirebase 数据库替换用户 id 云函数
【发布时间】:2018-07-02 21:47:01
【问题描述】:

我正在开发一个具有 Firebase 和云功能的项目,但我在这里遇到了困难:

我有一个具有相关 ID 的用户。 该 id(我们称其为“oldID”)在数据库的其他节点中使用。 由于某些原因,我需要更改该 id 并将其替换为另一个。

我想使用云功能来做到这一点,因为我知道 Firebase 不支持这种“全部替换”功能。顺便说一句,我找不到一种方法来循环遍历所有可能的节点并寻找那个特定的 oldID。

你们有什么建议吗?

谢谢, 公关

示例

用户 --

  id1 --
      //user1 data
  id2 --
      //user2 data

组 --

  group1 --
      id1:email1
      id2:email2
  group2--

然后,在某个时候,我需要将用户 1 (id1) 的 id 更改为另一个 id(比如说 newid1)。我需要的是这个例子来改变:

用户 --

  newid1 --
      //user1 data
  id2 --
      //user2 data

组 --

  group1 --
      newid1:email1
      id2:email2
  group2--

【问题讨论】:

    标签: javascript firebase firebase-realtime-database google-cloud-functions


    【解决方案1】:

    如果这是您需要做的一次性编辑。我建议您导出整个数据库:

    On the top right click 'Export JSON'

    下载数据库后,只需在编辑器中打开它,然后查找/替换旧/新 uid:

    On the top right click 'Import JSON'

    【讨论】:

    • 您好,感谢您的回复,但我正在寻找一种以编程方式执行此操作的方法,因为不幸的是它不是一次性编辑,但我需要多次。
    【解决方案2】:

    读取整个用户集合 .where('oldID', '==', <YOUR-VALUE>) 遍历每个文档 并将编辑后的值添加到批处理中 删除它,并用它的副本创建一个新的,你需要使用 Object.assign() 或更好的扩展运算符进行深层复制:

    let batch = firestore.batch()
    
    firebase.firestore().collection('users').get().then(snap => {
       snap.forEach(doc => {
         let newID = // I don't know where you're getting this, your <<oldID>> is doc.id
    
         let userData = { ... doc.data() }
    
         batch.delete(doc.ref)
         batch.set(firestore.collection('users').doc(newID), userData)
       })
    
       return batch.commit()
     }).then(outcome => {
        console.log(outcome)
        res.end()
     }).catch(e => {
        console.error(e)
     })
    

    【讨论】:

    • 嗨,Davide,明白了你的意思,但我想我可能不好解释我的问题。用户 id 实际上是我要更改的 id,我无法执行“where”功能,因为我不知道值,我想替换键
    猜你喜欢
    • 2018-05-29
    • 2019-02-26
    • 1970-01-01
    • 2017-12-26
    • 1970-01-01
    • 1970-01-01
    • 2020-04-09
    • 2018-09-02
    相关资源
    最近更新 更多