Firebase数据库startAt()字符串参数长度限制?

时间:2018-07-03 10:04:06

标签: javascript firebase firebase-realtime-database

本打算将其发布到他们的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 个答案:

答案 0 :(得分:2)

您似乎对startAt操作感到困惑,并且正在尝试使用它来过滤以 开头的特定子字符串的字符串。但是startAt并不是这样。

当您按param的值对子项进行排序时,Firebase会按该属性的值对所有子项进行排序。然后,当您从abcdefghijklmnopqrstuvwxyz0123456789ABCDEF_0123456789ABCDEFabc开始时,它将从该点开始返回节点。并且按此顺序,abcdefghijklmnopqrstuvwxyz0123456789ABCDEF_123456789ABCDEFabcdefghijklmnopqrstuvwxyz0123456789ABCDEFabcdefghijklmnopqrstuvwxyz0123456789ABCDEF_0123456789ABCDEFabc之后。

如果您希望第一个孩子从开始开始一定的值,请考虑使用.startAt(searchTerm).limitToFirst(1)

如果您希望孩子从开始开始使用某个值,请使用封闭范围startAt(searchTerm).endAt(searchTerm+"\uf8ff")。这里的\uf8ff是最后一个unicode字符。

答案 1 :(得分:1)

我只是尝试在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)
            }
    })
}

这将输出:

  

key4

     

key5

     

key2

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