QML Firebase startAt returns 未定义
QML Firebase startAt returns undefined
我正在开发一个“预先输入”类型的功能,它将检查我的数据库与当前键入的文本,以提供使用 Felgo 的用户的搜索建议。
这是link Felgos Firebase documentation
为了不搜索每个条目,我希望使用 startAt
和 limitTo
来减少数据使用。
然而,当应用 startAt
我的搜索时只有 return 未定义,我尝试通过将我的 startAt 从变量更改为显式数据来测试它,但这仍然只有 return 未定义.
我的函数如下:
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)
传递我的 var searchString
并且 return 未定义!
完全删除 startAt:
查询 returns nameList
的整个结果如预期的那样,但无论我如何尝试实现我的 startAt
它总是 return未定义。
我的 nameList
JSON 的样本是:
nameList: {
"EddieLaw245" : 530343772383,
"EddieLawrence91" : 530343772385,
"EdwardL91" : 530343772386,
"EdwardLaw" : 530343772384,
"Edwardlawrence91" : 530343772380,
"JoBrownLondon" : 530343772381,
"KatiePrescottHair" : 543592635596,
"Tracey-Sweeting" : 530343772382
}
所以在上面的例子中,当我输入 E
时,它应该删除最后 3 个条目,依此类推。
问题在于您指定了 orderByChild: true
。如果我们查看其中的 documentation:
orderByChild: If present, the queried object will have its properties ordered by values at sub-paths defined by the value of this property. Ordering by child properties makes the filter properties startAt, endAt and equalTo filter by the child property values
这可能不是很清楚,但是 orderByChild
允许您对 属性 值 每个节点下的结果进行排序。因此,您的代码尝试根据 属性 true
的值对子节点进行排序,这是不可能的(并且实际上应该在库中生成编译时错误)作为 nameList
没有自己的子属性。他们只有一个键和一个值。
您正在寻找的是 orderByKeys
,它根据键对子节点进行排序。所以:
db.getValue("public/nameList/", {
orderByKeys: true,
startAt: searchString,
limitToFirst: 10,
}
您通常还需要指定一个 endAt
值,以确保您的预输入仅显示以 和 搜索字符串开头的值。如果您只允许在键中使用 ASCII 值,最简单的方法是:
startAt: searchString,
endAt: searchString + "~",
这里的~
不是魔术运算符,只是最后的ASCII字符。如果要允许更广泛的字符集,则需要使用该字符集中的最后一个字符 - 例如 \uF7FF
是 Unicode 的最后一个代码点。
从 OP 更新
尽管我确信 Franks 对典型的 Firebase 用法是正确的;我怀疑由于 Felgo 插件,我使用的完整解决方案略有调整;
db.getValue("public/nameList/", {
"orderByKey": true,
"startAt": searchString,
"endAt": searchString+"~",
"limitToFirst": 10,
}, function(success, key, value) {....}
})
上面的注释 - 我的 filters/queries 被引号 "startAt"
包围着,我也用 orderByKey
而不是 orderByKeys
我正在开发一个“预先输入”类型的功能,它将检查我的数据库与当前键入的文本,以提供使用 Felgo 的用户的搜索建议。
这是link Felgos Firebase documentation
为了不搜索每个条目,我希望使用 startAt
和 limitTo
来减少数据使用。
然而,当应用 startAt
我的搜索时只有 return 未定义,我尝试通过将我的 startAt 从变量更改为显式数据来测试它,但这仍然只有 return 未定义.
我的函数如下:
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)
传递我的 var searchString
并且 return 未定义!
完全删除 startAt:
查询 returns nameList
的整个结果如预期的那样,但无论我如何尝试实现我的 startAt
它总是 return未定义。
我的 nameList
JSON 的样本是:
nameList: {
"EddieLaw245" : 530343772383,
"EddieLawrence91" : 530343772385,
"EdwardL91" : 530343772386,
"EdwardLaw" : 530343772384,
"Edwardlawrence91" : 530343772380,
"JoBrownLondon" : 530343772381,
"KatiePrescottHair" : 543592635596,
"Tracey-Sweeting" : 530343772382
}
所以在上面的例子中,当我输入 E
时,它应该删除最后 3 个条目,依此类推。
问题在于您指定了 orderByChild: true
。如果我们查看其中的 documentation:
orderByChild: If present, the queried object will have its properties ordered by values at sub-paths defined by the value of this property. Ordering by child properties makes the filter properties startAt, endAt and equalTo filter by the child property values
这可能不是很清楚,但是 orderByChild
允许您对 属性 值 每个节点下的结果进行排序。因此,您的代码尝试根据 属性 true
的值对子节点进行排序,这是不可能的(并且实际上应该在库中生成编译时错误)作为 nameList
没有自己的子属性。他们只有一个键和一个值。
您正在寻找的是 orderByKeys
,它根据键对子节点进行排序。所以:
db.getValue("public/nameList/", {
orderByKeys: true,
startAt: searchString,
limitToFirst: 10,
}
您通常还需要指定一个 endAt
值,以确保您的预输入仅显示以 和 搜索字符串开头的值。如果您只允许在键中使用 ASCII 值,最简单的方法是:
startAt: searchString,
endAt: searchString + "~",
这里的~
不是魔术运算符,只是最后的ASCII字符。如果要允许更广泛的字符集,则需要使用该字符集中的最后一个字符 - 例如 \uF7FF
是 Unicode 的最后一个代码点。
从 OP 更新 尽管我确信 Franks 对典型的 Firebase 用法是正确的;我怀疑由于 Felgo 插件,我使用的完整解决方案略有调整;
db.getValue("public/nameList/", {
"orderByKey": true,
"startAt": searchString,
"endAt": searchString+"~",
"limitToFirst": 10,
}, function(success, key, value) {....}
})
上面的注释 - 我的 filters/queries 被引号 "startAt"
包围着,我也用 orderByKey
orderByKeys