QML Firebase startAt returns 未定义

QML Firebase startAt returns undefined

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

这是link Felgos Firebase documentation

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

然而,当应用 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