javascript - 更改 Firebase 中元素的路径

标签 javascript firebase firebase-realtime-database

我想更改数据库中元素的位置。我尝试首先从一个位置删除该元素,然后将其推送到另一个位置。方法如下:

firebase.database().ref('completed').on('value', (snapshot) => {
  snapshot.forEach((snapchild) => {
    if(snapchild.val().title === item.title && snapchild.val().id === item.id) {
      firebase.database().ref('todos').push(snapchild.val()).then(() => {
        firebase.database().ref(`anotherlocation/${snapchild.key}`).remove()
      }
    }
  })
})

不幸的是,它不起作用,该元素被删除,但没有被添加到另一个位置。 这是正确的做法吗?

编辑:添加了 firebase 结构。 db

最佳答案

代码存在一些问题:

  1. 您正在新位置调用 push,这意味着该项目已使用新 key 添加。您可能希望该项目在新位置具有与旧位置相同的 key 。
  2. 您正在执行两个数据库操作,这意味着第一个操作可能会成功,而另一个操作可能会失败。通过使用单个多位置更新,您可以确保两个写入都成功,或者两者都不发生。
  3. 您阅读的内容超出了需要。由于您知道要移动的项目的 id,因此您可以将读取操作限制于此。

在代码中:

var query = firebase.database().ref('completed').orderByChild('id').equalTo(item.id);
query.on('value', (snapshot) => {
  snapshot.forEach((snapchild) => {
    if(snapchild.val().title === item.title) {
      var updates = {};
      updates['/todos/'+snapchild.key] = snapchild.val();
      updates['/completed/'+snapchild.key] = null;
      firebase.database().ref().update(updates);
    }
  })
})

这会将带有 item.id 的已完成项目移回 todos。我不确定这是否是您想要执行的确切 Action ,因为您的问题并不清楚。如果没有,您必须更新 updates 中的路径。

关于javascript - 更改 Firebase 中元素的路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55205485/

相关文章:

javascript - signInWithEmailAndPassword 和 EmailAuthProvider

android - Firebase 测试实验室覆盖,Orchestrator 权限被拒绝

java - Firebase 数据库搜索查询无法正常工作

swift - 使用 Swift 在 firebase 数据库中检索父级的子级

javascript - 停止向节点追加相同的元素

c# - 如何在另一个文本字段中查看一个文本字段中的文本?

javascript - 如何使用 Javascript/JQuery 在没有 ActiveXObject 的情况下在文本文件中写入数据,因为它仅支持 IE?

Swift - Cloud Firestore 中的唯一 ID

ios - firebase - 在多个位置原子删除

javascript - $.Get 方法在each() 循环中不成立