我正在开发一个“提前”类型函数,它将检查我的数据库和当前的打印文本,以提供使用Felgo的用户的搜索建议。
以下是Felgos Firebase文档的链接
至于不是搜索每个条目,我希望使用startAt和limitTo作为一个较低的数据使用。
然而,当应用startAt时,我的搜索只返回未定义的,我尝试通过将startAt从变量更改为显式数据来测试它,但这仍然只返回未定义的数据。
我的职能如下:
function searchUsers(searchString) {
db.getValue("public/nameList/", {
orderByChild: true,
startAt: searchString, //searchString is a variable with my .currentText to search.
limitToFirst: 10,
}, function(success, key, value) {
if(success) {
searchArr = []
searchArr = value
console.debug("Read user value for key", key, "from DB:", value)
}
})
}我也尝试过通过JSON.stringify(searchString)传递我的JSON.stringify(searchString),并且返回未定义的!
删除startAt:查询将像预期的那样完全返回nameList的整个结果,但无论我如何实现nameList,它总是返回未定义的结果。
我的nameList JSON示例如下:
nameList: {
"EddieLaw245" : 530343772383,
"EddieLawrence91" : 530343772385,
"EdwardL91" : 530343772386,
"EdwardLaw" : 530343772384,
"Edwardlawrence91" : 530343772380,
"JoBrownLondon" : 530343772381,
"KatiePrescottHair" : 543592635596,
"Tracey-Sweeting" : 530343772382
}因此,在上面的示例中,当我输入E时,它应该删除最后3个条目,依此类推。
发布于 2021-08-11 15:08:52
问题在于您指定的是orderByChild: true。如果我们看一下它的文档:
orderByChild:如果存在,则查询对象的属性将由该属性值定义的子路径上的值排序。按子属性排序使筛选属性startAt、endAt和equalTo根据子属性值进行筛选。
这可能不是立即明确的,但是orderByChild允许您在每个节点下对属性值排序结果。因此,您的代码试图在属性true的值上对子节点排序,这是不可能的(而且实际上应该在库中生成编译时错误),因为nameList下的节点没有自己的任何子属性。他们只有一把钥匙和一个价值。
您要寻找的是orderByKeys,它命令其密钥上的子节点。所以:
db.getValue("public/nameList/", {
orderByKeys: true,
startAt: searchString,
limitToFirst: 10,
}您通常还希望指定一个endAt值,以确保您的提前输入只显示以搜索字符串开头的值。如果只允许键中的ASCII值,最简单的方法是:
startAt: searchString,
endAt: searchString + "~",这里的~不是魔术运算符,而是最后的ASCII字符。如果希望允许更广泛的字符集,则需要使用该字符集中的最后一个字符--例如,\uF7FF是Unicode的最后一个代码点。
更新从OP,虽然我是证明与典型的Firebase使用的法兰克正确;我怀疑由于费尔戈插件,我正在使用的完全解决方案有一个轻微的调整;
db.getValue("public/nameList/", {
"orderByKey": true,
"startAt": searchString,
"endAt": searchString+"~",
"limitToFirst": 10,
}, function(success, key, value) {....}
})上面的注释-我的过滤器/查询被引号"startAt"包围,也没有使用orderByKeys,而是使用了orderByKey。
https://stackoverflow.com/questions/68741562
复制相似问题