代码之家  ›  专栏  ›  技术社区  ›  vir us

firebase database startat()字符串参数长度限制?

  •  0
  • vir us  · 技术社区  · 8 年前

    本打算将此发布到他们的github回购协议中,但似乎他们更喜欢在这里提出一般性问题。

    所以在使用 startAt() 从firebase数据库中获取数据?

    我遇到了一个问题,它似乎只限于41个符号,我似乎找不到任何文件来证实这一点。

    如果这确实是一个极限,那么有没有办法改变它呢?(我需要能够根据最多60个符号的值进行筛选)

    我的意思是,我仍然可以传递更长的参数,但是数据库返回的结果只被前41个字符过滤掉,而忽略值的其余部分。

    我在用js-sdk,以防万一。

    数据集(每个值大约100个字符长,前41个字符在每个值中相同,但在尾部不同)

    {
      "obj1": {"param": "abcdefghijklmnopqrstuvwxyz0123456789ABCDEF_0123456789ABCDEFabcdefghijklmnopqrstuvwxyz0123456789ABCDEF"},
      "obj2": {"param": "abcdefghijklmnopqrstuvwxyz0123456789ABCDEF_123456789ABCDEFabcdefghijklmnopqrstuvwxyz0123456789ABCDEF"},
      "obj3": {"param": "abcdefghijklmnopqrstuvwxyz0123456789ABCDEF_23456789ABCDEFabcdefghijklmnopqrstuvwxyz0123456789ABCDEF"},
      "obj4": {"param": "abcdefghijklmnopqrstuvwxyz0123456789ABCDEF_3456789ABCDEFabcdefghijklmnopqrstuvwxyz0123456789ABCDEF"},
      "obj5": {"param": "abcdefghijklmnopqrstuvwxyz0123456789ABCDEF_456789ABCDEFabcdefghijklmnopqrstuvwxyz0123456789ABCDEF"}
    }
    

    现在我需要通过键“param”的值来检索“obj1”,并且我只知道它的前60个字符(所以我不能使用equalto())

    var ref = firebase.database().ref("/some/data");
    
    ref.orderByChild("param")
       .startAt("abcdefghijklmnopqrstuvwxyz0123456789ABCDEF_0123456789ABCDEFabc") <- this guy is 60 characters long
       .once("value")
       .then(function(snapshot) {
         snapshot.forEach(function(child) {
           console.log(child.key);
         });
       })
    

    我希望这里只有一个结果,但是上面的代码返回集合中的所有记录。

    2 回复  |  直到 8 年前
        1
  •  2
  •   Frank van Puffelen    8 年前

    你好像很困惑 startAt 操作,并尝试使用它筛选开始的字符串 具有 一个特定的子串。不是这样的 开始 不过,也行。

    当你按照 param ,firebase根据该属性的值对所有子级进行排序。当你开始 abcdefghijklmnopqrstuvwxyz0123456789ABCDEF_0123456789ABCDEFabc 它从那一点开始返回节点。按照这个顺序 abcdefghijklmnopqrstuvwxyz0123456789ABCDEF_123456789ABCDEFabcdefghijklmnopqrstuvwxyz0123456789ABCDEF 后来居上 efghijklmnopqrstuvwxyz0123456789abcdef abcdefabc 是的。

    如果你想让第一个孩子 在 某个值,考虑使用 .startAt(searchTerm).limitToFirst(1) 是的。

    如果你想让孩子们开始 具有 一个特定的值,使用一个封闭的范围 startAt(searchTerm).endAt(searchTerm+"\uf8ff") 是的。在这里 \uf8ff 是最后一个Unicode字符。

        2
  •  1
  •   Frank van Puffelen    8 年前

    我只是在javascript项目和swift项目中尝试重现这个问题,但未能成功。

    我的数据集:

    {
      "key1" : "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789",
      "key2" : "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFZHIJKLMNOPQRSTUVWXYZ0123456789",
      "key3" : "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFHHIJKLMNOPQRSTUVWXYZ0123456789",
      "key4" : "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFIHIJKLMNOPQRSTUVWXYZ0123456789",
      "key5" : "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFJHIJKLMNOPQRSTUVWXYZ0123456789"
    }
    

    我的javascript代码:

    var ref = firebase.database().ref("/51151783");
    
    ref.orderByValue()
       .startAt("abcdefghijklmnopqrstuvwxyz0123456789ABCDEFI")
       .once("value")
       .then(function(snapshot) {
         snapshot.forEach(function(child) {
           console.log(child.key);
         });
       })
    

    我的SWIFT代码:

    func searchForLongValue51151783() {
        let ref = Database.database().reference(withPath: "51151783")
        ref.queryOrderedByValue().queryStarting(atValue: "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFI").observeSingleEvent(of: .value, with: { (snapshot) in
                for child in snapshot.children {
                    print((child as! DataSnapshot).key)
                }
        })
    }
    

    这将输出:

    键4

    键5

    键2

    还有jsbin: http://jsbin.com/lupebuwihu/edit?js,console 是的。

    推荐文章