【问题标题】:Firebase Realtime Database equalTo query for child in increasing keysFirebase 实时数据库 equalTo 在增加键中查询子项
【发布时间】:2021-11-29 06:04:37
【问题描述】:

我正在尝试从数据库中获取数据。但是在我更改了我的代码之后 我的 react-native 项目的性能问题,我找不到我想要的查询。 交易是我有这种类型的数据结构。它位于 /root/news/0/coin_name 下。 0键是 我的每个数据都增加了 1,2,3...n。为了更好地理解:

cnh
I
I
--coins
|
|
--news|
      |
      |--0|
          --coin_name='algorand'
          ...
      |--1|
          ...

我想获取 coin_name 等于 'algorand' 的数据。我尝试了一些查询,但没有一个有效。如果你能帮助我,我将不胜感激。

我试过了:

useEffect(()=>{
        const fbdb = async () =>{
            await database()
      .ref(newsKey)
      .orderByChild('year')
      .equalTo('2021')
      .once('value')
      .then(snapshot => {
        const data = snapshot.val();
        const formattedResponse=formatMarketData(data,show);
        return setNews(formattedResponse)
      });
      };
    
        fbdb();
       
    },[show,year]);

编辑 最后,我将数据从我的 excel 文件推送到实时数据库,字符串数据的问题解决了,对于等于查询的年份,我应该在解析年份值后首先将其解析为 int整数也解决了这个问题。

【问题讨论】:

    标签: javascript firebase react-native firebase-realtime-database


    【解决方案1】:

    我想你正在寻找

    await database()
      .ref('news')
      .orderByChild('coin_name')
      .equalTo('algorand')
    

    请注意,这些数字顺序键通常是 Firebase 中的反模式。要了解原因以及更惯用的按键结构,请阅读Best Practices: Arrays in Firebase

    一个工作示例:https://jsbin.com/focaveq/3/edit?js,console

    【讨论】:

    • 不幸的是,这不起作用。我正在从 excel 中手动编写数据,在将其解析为 json firebase 后自行分配数字顺序键。我将尝试在 python 中编写一个从 excel 到 firebase 的推送脚本,以将随机字符串键分配给数据,也许在那之后这个查询可能会起作用。还是谢谢!
    • 如果你编写脚本,你也可以在数字前加上一个字符串——比如key0key1。但这与如何使查询正常工作是分开的,这就是您要问的。您是否尝试过我的答案中的代码?它奏效了吗?如果没有,发生了什么?
    • 我确实试过你的代码,没有 .once('value') 查询,我无法用 .then 捕获快照,所以我添加了它,查询返回空结果。使用 useEffect(()=>{ const fbdb = async () =>{ await database() .ref(newsKey) .once('value') .then(snapshot => { const data = snapshot.val(); const formattedResponse=formatMarketData(data,show); return setNews(formattedResponse) }); }; fbdb(); },[show,year]);该查询我可以获取所有数据。
    • 使用 orderbychildname 查询根本不起作用。我的硬币行中有另一个数据,当我尝试 .ref("/coins/coinX").orderByChild('year').equalTo('2021').once('value')... 完美.
    【解决方案2】:

    在我对网络进行了所有研究之后,我得出的结论是,firebase 实时数据库 api 不支持具有未知路径的嵌套查询。在获取所有数据后,我应该使用另一种结构或过滤数据(这对于大型数据集来说效率非常低)。所以我决定尝试只在没有新闻标签的情况下使用 Firestore 来获取新闻。我会告诉你这种方法是否有效。

    【讨论】:

    • 您的数据结构似乎有一个动态级别,这是 Firebase 可以查询的(使用我的答案中包含的代码)。您可以编辑您的问题以包含实际的 JSON(作为文本,没有屏幕截图),而不是示意图?您可以通过单击Firebase Database console 上溢出菜单 (⠇) 中的“导出 JSON”链接来获取此信息。
    • 当然,我生成了我的数据的一个实例,我也尝试将它再次导入到 Firebase,它工作正常。所以我们可以假设它仍然代表问题。我发布了答案。
    • 来自my answer 的工作代码在您的数据结构上:jsbin.com/focaveq/3/edit?js,console
    【解决方案3】:

    {
      "coins" : [ {
        
      } ],
      "news" : [ {
        "coin_name" : "algorand",
        "event_date" : "2019-06-24",
        "exchange" : "crypto.com",
        "month" : "6",
        "year" : "2019"
      }, {
        "coin_name" : "algorand",
        "event_date" : "2021-01-06",
        "exchange" : "bitmart",
        "month" : "1",
        "year" : "2021"
      },  {
        "coin_name" : "litecoin",
        "event_date" : "2020-12-25",
        "exchange" : "binance qtly",
        "month" : "12",
        "year" : "2020"
      }, {
        "coin_name" : "litecoin",
        "event_date" : "2021-01-04",
        "exchange" : "coinflex",
        "month" : "1",
        "year" : "2021"
      }, 
         {
        "coin_name" : "tron",
        "event_date" : "2020-06-20",
        "exchange" : "resfinex",
        "month" : "6",
        "year" : "2020"
      }, {
        "coin_name" : "tron",
        "event_date" : "2020-07-07",
        "exchange" : "all",
        "month" : "7",
        "year" : "2020"
      }, {
        "coin_name" : "tron",
        "event_date" : "2020-07-10",
        "exchange" : "phemex",
        "month" : "7",
        "year" : "2020"
      }, {
        "coin_name" : "tron",
        "event_date" : "2021-04-21",
        "exchange" : "all",
        "month" : "4",
        "year" : "2021"
      }, {
        "coin_name" : "tron",
        "event_date" : "2021-05-19",
        "exchange" : "phemex",
        "month" : "5",
        "year" : "2021"
      }, {
        "coin_name" : "tron",
        "event_date" : "2021-06-17",
        "exchange" : "bitpanda",
        "month" : "6",
        "year" : "2021"
      } ]
    }

    这是数据集的实例

    【讨论】:

    • 由于这似乎不是答案,请考虑更新您的问题。这将是提供 cmets 中要求的附加信息的适当方式。谢谢。
    • 第一次问东西,我想我正在学习......谢谢!
    猜你喜欢
    • 1970-01-01
    • 2018-09-14
    • 1970-01-01
    • 2022-01-05
    • 2019-09-13
    • 1970-01-01
    • 1970-01-01
    • 2019-07-31
    • 1970-01-01
    相关资源
    最近更新 更多