这是我在 Firebase DB 上存储数据的方式:
USERS : {
UUID : {
username : "a"
}
UUID :{
username : "b"
}
我已经在规则上对用户名进行了索引。 这是尝试检索数据的查询:
var dbRef = Database
.database(url:"http//servername").reference(withPath: "users")
//
dbRef.queryOrdered(byChild: "username").queryStarting(atValue: initials, childKey: "username")
.observeSingleEvent(of: .value) { datasnap in
var a = datasnap.value
var b = a as! [String : Any]
b.forEach { key, value in
var a = value as! [String : Any]
print(a["username"] as! String)
}
我遇到的问题是:
是否有人有任何解决方案或想法,以实际通过姓名首字母搜索用户名并且不收到随机结果(也不区分大小写)。
对于类似的问题,堆栈上有两个答案,但都是 5-10 年前的答案,并且不起作用。 谢谢大家,
这个挑战就像专业知识 - 使用字符串键搜索对象以在 firestore 上搜索数据。
let startTxt: String = searchKey
let endTxt: String = searchKey + "\u{f8ff}"
FUSER_REF
.whereField(User.key_uname, isGreaterThanOrEqualTo: startTxt)
.whereField(User.key_uname, isLessThanOrEqualTo: endTxt)
.limit(to: count)
.getDocuments{ (doc, err) in ....
让我知道这是否适合您! :)
将用户名以小写形式保存在数据库中是有好处的。这样,您可以使用更新的开始和结束文本搜索用户名。
let startTxt: String = text.lowercased().trimmingCharacters(in: .whitespacesAndNewlines)
let endTxt: String = (text + "\u{f8ff}").lowercased().trimmingCharacters(in: .whitespacesAndNewlines)
这在拥有 1,700,000 个用户的数据库中运行良好。
我需要使用
.queryStarting(afterValue: initials
,而不是 atValue
。