我正在尝试获取名称包含 Firebase 给定字符串的所有用户。
例如,如果我有这些用户:
Devid, Andy, Bob
我希望获得名称中包含“D”的所有用户,因此我希望得到这样的结果:
Devid, Andy
这是我的 Firebase 目前的结构:
由于 Firebase 区分大小写,我创建了一个属性name_
包含小写名称。
使用 startAt 和 endAt 我可以获取名称以定义的字符串开头的所有用户
ref.orderByChild("name_").startAt(text).endAt(text+"\uf8ff").on('value', ...);
但这只给我提供了名称以给定字符串开头的用户,例如,如果文本是“D”,我会得到:
Devid
1)目前我的查询意味着“给我所有具有以给定字符串开头的 name_ 的用户”,有没有办法让它意味着“给我所有名称包含给定字符串的用户”?EDIT: NO
Firebase 查询没有类似于全文搜索的功能
运营商。为了实现这些,您要么必须集成一个
外部全文搜索引擎,或者想出一个非常详尽的
自定义索引方案。Firebase 和索引/搜索 https://stackoverflow.com/questions/10559191/firebase-and-indexing-search
2)目前我不想使用服务器端代码,什么是实现自定义索引的良好且有效的方法?
Thanks
好的 - 目前的结构无法完全满足您的要求。
然而,这突然出现在我的脑海中:
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”
Edit:
您可以变得非常疯狂并添加更多组合来扩展您的搜索能力
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 提取您需要的内容会更有效(如果您的数据集有限)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)