【问题标题】:Add element in JSON without key identifier - FIREBASE在没有键标识符的 JSON 中添加元素 - FIREBASE
【发布时间】:2019-05-06 01:07:30
【问题描述】:

这是我的 firebase 数据库的结构和我用来创建该 firebase 结构的 json 文件。

“菜单”是成分列表,按类别划分,例如“窗格”(英文中的面包)。 “窗格”具有字段“lista”,其中包含所有面包类型(每种类型的面包有 3 个字段:“attivo”、“nome”、“prezzo”)。 我需要要求用户添加一个新成分,所以要添加一个具有“attivo”、“nome”、“prezzo”字段的新元素。

问题是我的子成分(面包的类型)没有标识符,所以我不知道如何在没有 id 键的情况下将孩子添加到“Lista”。

使用此代码(在我的打字稿文件中使用)所有“lista”字段都被新元素替换,我不能使用 .Child() 因为我没有要传递的标识符:

firebase.database().ref('/menu/pane/lista').set({ 
      nome: data['nome'],
      prezzo: data['prezzo'],
      attivo: false, 
});

是否可以在没有标识符的情况下添加元素并遇到像我的 json 文件这样的情况?

编辑 如果我使用 set 或 push,我的 json 结构会发生变化,我不希望这样: 提前谢谢你。

已解决 我已经通过解决方法解决了这个问题。我检索填充“lista”的数组并像在普通数组中一样推送新成分,而不是在带有新元素的数组中推送到 firebase 上的“lista”。这样,所有“lista”内容都被我推送的数组替换了,但是数组有新元素,所以它可以工作!

【问题讨论】:

    标签: json typescript firebase firebase-realtime-database


    【解决方案1】:

    是的,可以将值保存到您将存储在lista 节点下的数组中,但这会产生一些“额外的复杂性”。有关详细信息,请参阅此 Firebase 博客文章:https://firebase.googleblog.com/2014/04/best-practices-arrays-in-firebase.html

    在没有(自然)uid 的情况下将一些数据添加到列表的推荐方法是使用push 方法: https://firebase.google.com/docs/reference/js/firebase.database.Reference#push

    因此,您应该执行以下操作,Firebase 会自动为您的新记录生成一个唯一 ID:

    firebase.database().ref('/menu/pane/lista').push({ 
          nome: data['nome'],
          prezzo: data['prezzo'],
          attivo: false
    });
    

    如果您不希望自动生成pane 节点的标识符(如“-LStoAsjJ....”之类的字母数字值),您需要自己生成它们。但是你必须使用transaction 来生成这个序列,这也会增加一些复杂性。使用push() 并重新设计前端代码可能会更好,这样您就可以处理 Firebase 生成的字母数字 uid。

    【讨论】:

    • 感谢您的帮助,但您的代码更改了我的 json 结构(请检查添加到我的问题的图像),我想避免这种情况...
    • “你的代码改变了我的 json 结构”是什么意思?您的意思是,您现在有一个字母数字(神秘)值,而不是一个整数的记录标识符?
    • 我的意思是,正如您在我的第一张图片中看到的那样,我在“lista”字段中的成分没有标识符。我有 lista = [{element1},{element2},..etc..] 如果我将该 json 上传到 firebase,我将获得您在同一张图片中看到的结构。 0、1 等不是对象的标识符,而是元素在我的“lista”字段中的“位置”。如果我插入一个带有 push 或 set 的新元素,它创建的每个元素的标识符,并且如果我从 firebase 导出我的新 json,则结构会发生变化(如第二张图片中所示)。这种新结构与我以前的结构不兼容。
    • 好的,我明白了。实际上,在列表中添加具有自动生成的 uid 的节点会将导出从数组转换为对象。如果您想在这种情况下使用 Firebase 控制台中的导出 JSON 功能,我认为没有解决方案。这完全取决于您对这个 JSON 的确切操作以及为什么需要通过控制台导出它(除了“管理”目的)。您可以通过 JavaScript SDK 甚至通过 REST API 获取这些数据。
    • 是的,它在您链接的帖子中:D 我会接受您的回答。幸运的是,在我的应用中,只有一位用户会更改数据,所以我没有并发问题。
    猜你喜欢
    • 2021-07-11
    • 2019-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-23
    • 2019-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多