首页 > 解决方案 > QML Firebase startAt 返回未定义

问题描述

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

这是Felgos Firebase 文档的链接

至于不搜索每个条目,我希望使用startAtandlimitTo来减少数据使用。

但是,当应用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)
               }
           })
}

我也尝试过var searchString通过JSON.stringify(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 个条目,依此类推。

标签: firebasefirebase-realtime-databaseqmlfelgo

解决方案


问题是您正在指定orderByChild: true. 如果我们查看该文档

orderByChild:如果存在,则查询对象的属性将按此属性值定义的子路径中的值排序。按子属性排序使过滤器属性 startAt、endAt 和 equalTo 按子属性值过滤

从这里可能不会立即清楚,但允许您对每个节点orderByChild的属性值进行排序。因此,您的代码尝试根据 property 的值对子节点进行排序,这是不可能的(实际上应该在库中生成编译时错误),因为下面的节点没有自己的任何子属性。它们只有一个键和一个值。truenameList

您正在寻找的是orderByKeys,它在其键上对子节点进行排序。所以:

db.getValue("public/nameList/", {
    orderByKeys: true,
    startAt: searchString,
    limitToFirst: 10,
}

您通常还需要指定一个endAt值,以确保您的预输入仅显示搜索字符串开头的值。如果您只允许键中的 ASCII 值,那么最简单的方法是:

  startAt: searchString,
  endAt: searchString + "~",

这里~不是魔术运算符,而只是最后的 ASCII 字符。如果要允许更广泛的字符集,则需要使用该字符集中的最后一个字符 - 例如\uF7FFUnicode 的最后一个代码点。

来自 OP 的更新 虽然我在典型的 Firebase 使用中是正确的 Franks;我怀疑由于 Felgo 插件,我使用的完整解决方案有轻微的调整;

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

上面的注释 - 我的过滤器/查询用引号括起来"startAt"orderByKeys我也用过orderByKey


推荐阅读