【问题标题】:QML Firebase startAt returns undefinedQML Firebase startAt 返回未定义
【发布时间】:2021-08-25 04:20:46
【问题描述】:

我正在开发一个 'typeahead' 类型功能,该功能将使用当前键入的文本检查我的数据库,以提供使用 Felgo 的用户的搜索建议。

这是Felgos Firebase documentation的链接

为了不搜索每个条目,我希望使用 startAtlimitTo 来减少数据使用量。

但是,当应用 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) 传递我的var searchString 并返回未定义!

删除startAt: 查询完全按预期返回nameList 的整个结果,但无论我如何尝试实现我的startAt,它总是返回未定义。

我的nameList JSON 示例是:

nameList: {
  "EddieLaw245" : 530343772383,
  "EddieLawrence91" : 530343772385,
  "EdwardL91" : 530343772386,
  "EdwardLaw" : 530343772384,
  "Edwardlawrence91" : 530343772380,
  "JoBrownLondon" : 530343772381,
  "KatiePrescottHair" : 543592635596,
  "Tracey-Sweeting" : 530343772382
}

所以在上面的例子中,当我输入 E 时,它应该删除最后 3 个条目,依此类推。

【问题讨论】:

    标签: firebase firebase-realtime-database qml felgo


    【解决方案1】:

    问题在于您指定了orderByChild: true。如果我们看一下documentation

    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 使用情况是正确的 Franks;我怀疑由于 Felgo 插件,我使用的完整解决方案略有调整;

    db.getValue("public/nameList/", {
        "orderByKey": true,
        "startAt": searchString,
        "endAt": searchString+"~",
        "limitToFirst": 10,
        }, function(success, key, value) {....}
    })
    

    以上注意事项 - 我的过滤器/查询用引号 "startAt" 括起来,而不是 orderByKeys,我使用了 orderByKey

    【讨论】:

    • 您好,弗兰克,感谢您的回答!我编辑了我的代码进行测试,我的输出保持不变,请参阅下面的所有按键日志(直到第三个字符我才发送函数):Search String: Edw Error with message: undefined Search String: Edwa Error with message: undefined Search String: Edwar Error with message: undefined Search String: Edward Error with message: undefined Search String: EdwardL Error with message: undefined Search String: EdwardLa Error with message: undefined Search String: EdwardLaw Error with message: undefined
    • 此外,我最初使用orderByChild,因为在没有任何过滤或查询的情况下仅读取“键”,它只返回"nameList",但是orderByChild没有过滤/查询返回@的完整JSON 987654340@,所以我感谢您的提示!
    • 你需要orderByKeys: true` 而不是orderByChild。调用 orderByChild: true永远不会起作用,因为 true 不是有效的属性名称。
    • 嗨弗兰克,所以;我完全不知道为什么 - 但是,我一时兴起尝试将我的查询放在这样的对象中:orderByKeys: true, startAt: { key: searchString }, endAt: { key:searchString + "~" }, limitToFirst: 10 它有效吗?无论如何-我已经接受了您的回答,因为它确实使我走上了正确的道路,不确定您是否要编辑以包含对象!谢谢!
    • 更新坦率(如果你想编辑你的答案);在我的查询/过滤器中添加引号并将 orderByKeys 更改为“orderByKey:”完美地工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-05
    • 1970-01-01
    • 1970-01-01
    • 2020-07-19
    • 2015-01-02
    • 2018-03-28
    • 1970-01-01
    相关资源
    最近更新 更多