【问题标题】:Firebase string match at end of field [duplicate]字段末尾的Firebase字符串匹配[重复]
【发布时间】:2018-12-05 18:48:38
【问题描述】:

想象以下数据:

{
  "name": "Abcdef",
  "age": 21
},
{
  "name": "Rodrigo",
  "age": 24
},
{
  "name": "Matt",
  "age": 30
},
{
  "name": "Def",
  "age": 21
}

我如何使这个搜索等效:

SELECT * FROM table WHERE name = "%def"

所以我得到这个结果:

{
  "name": "Abcdef",
  "age": 21
},
{
  "name": "Def",
  "age": 21
},

(或者至少是第一个结果,因为它的 %def) 我试过startAt 和endAt 也使用"\uf8ff" 但似乎没有任何效果....

这应该是解决方案:

ref.orderByChild("name").endAt("def"+"\uf8ff").once('value'....

含义:以'def'结尾,但这不起作用....

(我使用的是 Javascript SDK)

(注意:我的问题不是大写D,而是字符串匹配)

【问题讨论】:

    标签: javascript firebase firebase-realtime-database


    【解决方案1】:

    您调用的方法称为endAt(),但您正试图将其用作endsWith()。这是一种不同类型的操作,Firebase 不支持。

    Firebase 数据库查询只能进行前缀匹配:查找以某个子字符串开头的字符串。没有后缀匹配的操作,也没有找到包含某个值的字符串的操作。

    如果您的用例确实是后缀匹配,常见的解决方法是添加一个包含反向字符串的属性并在其上执行startAt().endAt()。

    所以:

    {
      "name": "Abcdef",
      "name_reverse": "fedcbA",
      "age": 21
    },
    {
      "name": "Def",
      "name_reverse": "feD",
      "age": 21
    },
    

    然后:

    ref.orderByChild("name_reverse").startAt("fed").endAt("fed\uf8ff")
    

    【讨论】:

    • 您正在确认 Firebase 无法做到这一点......这是在倒退......“哦,Firebase 很棒”......然后甚至无法执行正则表达式或其他操作找到一个字符串?
    • 太愚蠢了,我们可以进行前缀匹配但没有后缀或“在中间”......真可惜......
    • Firebase 数据库专注于客户端之间的数据快速同步。因此,与您可能使用过的许多其他数据库相比,它的查询功能相对简单。如果您有需要的用例,Ron 链接的答案显示了将 Firebase 与全文搜索引擎相结合的一种方法。通过以这种方式组合专用解决方案,您可以为几乎任何用例构建/组合精心设计的解决方案。
    • 这个答案需要更多的爱,非常清楚非常聪明的解决方法。再次感谢@FrankvanPuffelen
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多