Firebase 数据库按用户名首字母缩写搜索用户并返回所有用户 3 时出现问题

问题描述 投票:0回答:2

这是我在 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)
            }

我遇到的问题是:

  1. 当我检索 dataSnapshot 时,我拥有所有三个孩子,而不仅仅是用户名
  2. 无论缩写是什么,查询结果都会有不同的奇怪值

是否有人有任何解决方案或想法,以实际通过姓名首字母搜索用户名并且不收到随机结果(也不区分大小写)。

对于类似的问题,堆栈上有两个答案,但都是 5-10 年前的答案,并且不起作用。 谢谢大家,

swift firebase-realtime-database
2个回答
1
投票

这个挑战就像专业知识 - 使用字符串键搜索对象以在 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 个用户的数据库中运行良好。


0
投票

我需要使用

.queryStarting(afterValue: initials
,而不是
atValue

© www.soinside.com 2019 - 2024. All rights reserved.