本打算将其发布到他们的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);
});
})
我希望这里只有一个结果,但是上面的代码返回了该集中的所有记录。
答案 0 :(得分:2)
您似乎对startAt
操作感到困惑,并且正在尝试使用它来过滤以 开头的特定子字符串的字符串。但是startAt
并不是这样。
当您按param
的值对子项进行排序时,Firebase会按该属性的值对所有子项进行排序。然后,当您从abcdefghijklmnopqrstuvwxyz0123456789ABCDEF_0123456789ABCDEFabc
开始时,它将从该点开始返回节点。并且按此顺序,abcdefghijklmnopqrstuvwxyz0123456789ABCDEF_123456789ABCDEFabcdefghijklmnopqrstuvwxyz0123456789ABCDEF
在abcdefghijklmnopqrstuvwxyz0123456789ABCDEF_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