微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Firebase 实时数据库查询不适用于更大的数字

如何解决Firebase 实时数据库查询不适用于更大的数字

我正在查询我的订单列表,这是数据结构和我的数据库规则:

enter image description here

enter image description here

我使用这样的查询来确定最新价格是否达到了 tp 或 sl 价格,如下所示:

function GetBuyList(symbol,currentPrice) {
    //Less than or equal to,for buying search tp lesser than current price
    var buy_tp = db.ref(`orders/active_orders/${symbol}`).orderByChild("tp").startAt(`buy_tp_${0}`).endAt(`buy_tp_${currentPrice}`)

    //More than or equal to,for buying search sl higher than current price
    var buy_sl = db.ref(`orders/active_orders/${symbol}`).orderByChild("sl").startAt(`buy_sl_${currentPrice}`).endAt(`buy_sl_${100000000}`)

    buy_tp.once("value",function (snapshot) {
        // do some stuff once
        if (snapshot.val() !== null) {
            ProcessOrders(snapshot.val(),'tpHit',currentPrice)
        }
    });

    buy_sl.once("value",'slHit',currentPrice)
        }
    });
}

对于 1.211 等较低值的价格,它工作正常,但当价格变大时,buy_sl 查询不起作用,但 buy_tp 查询仍然正常工作。例如,当我查询 34886 之类的价格时,buy_sl 下面的数据不起作用:

enter image description here

编辑: 嗨弗兰克,这里的 json 导出:

{
  "active_orders" : {
    "BTCUSD" : {
      "-Masii03kq9LvuLfWOyG" : {
        "close_type" : "None","lot_size" : 1,"order_price" : 34888.17,"sl" : "buy_sl_34887","symbol" : "BTCUSD","tp" : "buy_tp_34889","ts" : 1622301925456,"type" : "buy","uid" : "6XaKYgXCsuMNg1d5bWYHg6ej5sd2"
      }
    },"EURUSD" : {
      "-MasVPCtD4sdPCcdF9S9" : {
        "close_type" : "None","order_price" : 1.211,"sl" : "buy_sl_1.210","symbol" : "EURUSD","tp" : "buy_tp_1.23","ts" : 1622298174339,"USDJPY" : {
      "-MasWoRREHQhvOR6iQ8G" : {
        "close_type" : "None","order_price" : 109.861,"sl" : "buy_sl_107.0","symbol" : "USDJPY","tp" : "buy_tp_110","ts" : 1622298543910,"uid" : "6XaKYgXCsuMNg1d5bWYHg6ej5sd2"
      }
    }
  }
}

例如,当我执行函数 GetBuyList("EURUSD",1.3) 或 GetBuyList("EURUSD",1.1) 时,返回的结果为:

{
  '-MasVPCtD4sdPCcdF9S9': {
    close_type: 'None',lot_size: 1,order_price: 1.211,sl: 'buy_sl_1.210',symbol: 'EURUSD',tp: 'buy_tp_1.23',ts: 1622298174339,type: 'buy',uid: '6XaKYgXCsuMNg1d5bWYHg6ej5sd2'
  }
}

当我执行这样的函数 GetBuyList("BTCUSD",34890) 时,它会返回:

{
  '-Masii03kq9LvuLfWOyG': {
    close_type: 'None',order_price: 34888.17,sl: 'buy_sl_34887',symbol: 'BTCUSD',tp: 'buy_tp_34889',ts: 1622301925456,uid: '6XaKYgXCsuMNg1d5bWYHg6ej5sd2'
  }
}

但是当我运行这个 GetBuyList("BTCUSD",34886) 时,没有任何回报。

解决方法

sltp 都是字符串,因为它们是字符串,所以它们不会被解析为数字,而是会进行字典排序。

发生这种情况的最常见示例之一是,如果您查看文件夹中的文件列表:

0.jpg
1.jpg
10.jpg
11.jpg
12.jpg
2.jpg
3.jpg
4.jpg
5.jpg
6.jpg
7.jpg
8.jpg
9.jpg

如果你不能从使用字符串切换,你需要用你预期的最大数字填充数字:

000.jpg
001.jpg
002.jpg
003.jpg
004.jpg
005.jpg
006.jpg
007.jpg
008.jpg
009.jpg
010.jpg
011.jpg
012.jpg
const formatWithPadding = (inp,digits) => {
  let n = Number(inp),nStr = `${Math.abs(n)}`,sign = n<0;
  return (sign ? '+' : '-') + (
    nStr.length > digits
      ? nStr
      : `${"0".repeat((digits || 1) - 1)}${nStr}`.slice(-digits)
  )
};

const tpVal = 1.210;
const [integerPart,fractionalPart] = String(tpVal).split(".");
const tp = `buy_tp_${formatWithPadding(integerPart,6)}.${fractionalPart || 0}`;

// tp is "buy_tp_+000001.210"

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?