运维开发网

在没有服务器端代码的Firebase中搜索

运维开发网 https://www.qedev.com 2020-03-18 10:33 出处:网络 作者:运维开发网整理
我试图让所有用户都拥有包含来自Firebase的给定字符串的名称. 例如,如果我有这些用户: Devid, Andy, Bob 我想让所有用户都拥有包含’D’的名称,所以我希望这样做: Devid, Andy 这是我Firebase的结构: 由于Firebase区分大小写,因此我创建了一个包含小写名称的属性name_. 使用startAt和endAt我可以获得名称以定义的字符串开头的所有用户 re
我试图让所有用户都拥有包含来自Firebase的给定字符串的名称.

例如,如果我有这些用户:

Devid, Andy, Bob

我想让所有用户都拥有包含’D’的名称,所以我希望这样做:

Devid, Andy

这是我Firebase的结构:

在没有服务器端代码的Firebase中搜索

由于Firebase区分大小写,因此我创建了一个包含小写名称的属性name_.

使用startAt和endAt我可以获得名称以定义的字符串开头的所有用户

ref.orderByChild("name_").startAt(text).endAt(text+"\uf8ff").on('value', ...);

但是这只给了我那个名字以给定字符串开头的用户,例如,如果文本是’D’,我会得到:

Devid

1)目前我的查询意味着“给我所有的用户名称_以一个给定的字符串开头”有没有办法让它意味着“给我所有用户的名字包含给定的字符串”?

编辑:没有

Firebase Queries don’t have anything similar to full-text search

operators. To accomplish those, you’ll either have to integrate an

external full-text search engine, or come up with a very elaborate

custom indexing scheme. 07001

2)目前我不想拥有服务器端代码,实现自定义索引的有效方法是什么?

谢谢

好的 – 没有办法用你当前的结构做你想要的.

然而,这只是突然出现在我脑海中:

users:
  user_1234
    first_name: "Devid"
    components:
       "D": true
       "e": true
       "v": true
       "i": true
       "d": true
  user_5678
    first_name: "Andy"
    components:
       "A": true
       "n": true
       "d": true
       "y": true
  user_1010
    first_name: "Bob"
    components:
       "B": true
       "o": true
       "b": true

这里有一些ObjC代码可以实现(并且经过测试!)

Firebase *ref = [myRootRef childByAppendingPath:@"users"];

FQuery *q1 = [ref queryOrderedByChild:@"components/b"];
FQuery *q2 = [q1 queryEqualToValue:@1];

[q2 observeEventType:FEventTypeChildAdded withBlock:^(FDataSnapshot *snapshot) {

    NSLog(@"%@", snapshot.value);

}];

此代码返回Bob.

要获得所有’d’人,请将“components / b”更改为“components / d”

编辑:

您可以变得非常疯狂并添加更​​多组合以扩展您的搜索功能

users:
  user_1234
    first_name: "Devid"
    components:
       "D": true
       "e": true
       "v": true
       "i": true
       "d": true
       "De": true
       "Dev": true
       "Devi": true
       "Devid": true
       "ev": true
       "evi": true
       "evid": true
       ... etc

编写几行代码来迭代名称并写出组合会非常简单.

显然,如果只是将所有的名字读入快照,将它们转储到一个数组中,并且(在ObjC中)使用NSPredicate来提取你需要的东西,效率会更高(如果你有一个有限的数据集).

0

精彩评论

暂无评论...
验证码 换一张
取 消