Правила безопасности Firebase продолжают запрашивать «Рассмотреть добавление «.indexOn»:» даже после добавления indexOn

#swift #firebase #firebase-realtime-database #firebase-security

#swift #firebase #firebase-realtime-database #firebase-безопасность

Вопрос:

Я добавил функцию поиска пользователя в firebase. Вот код:

     func searchUser(search: String, includeCurrentUser: Bool = true, completion: @escaping ([User]) -> (), withCancel cancel: ((Error) -> ())?) {
        Database.database().reference().child("users").queryOrdered(byChild:  "username").queryStarting(atValue: search , childKey: "username").queryEnding(atValue: search   "u{f8ff}", childKey: "username").observeSingleEvent(of: .value, with: { (snapshot) in
                guard let dictionaries = snapshot.value as? [String: Any] else {
                completion([])
                return
            }
            var users = [User]()
            dictionaries.forEach({ (key, value) in
                if !includeCurrentUser, key == Auth.auth().currentUser?.uid {
                    completion([])
                    return
                }
                guard let userDictionary = value as? [String: Any] else { return }
                let user = User(uid: key, dictionary: userDictionary)
                users.append(user)
            })
            
            users.sort(by: { (user1, user2) -> Bool in
                return user1.username.compare(user2.username) == .orderedAscending
            })
            completion(users)
            
            
        }){ (err) in
            print("Failed to fetch all users from database:", (err))
            cancel?(err)
        }
    }
  

При вызове searchUser в моей консоли Xcode указано:

[Firebase / Database] [I-RDB034028] С использованием неуказанного индекса. Ваши данные будут загружены и отфильтрованы на клиенте. Рассмотрите возможность добавления «.indexOn»: «username» в / users к вашим правилам безопасности для повышения производительности

Вот мои правила firebase:

 {
  /* Visit https://firebase.google.com/docs/database/security to learn more about security rules. */
  "rules": {
    ".read": true,
    ".write": true,
    "posts" : {
        ".indexOn": "creationDate"
    },
    "purchaser" : {
        "$postID" : {
         ".indexOn": ".value"
      }
    },
      "users" : {
        "$uid": {
            ".indexOn" : "username"
        }
      }
    }
    }
  

И вот моя структура базы данных:

введите описание изображения здесь

Таким образом, функция searchUser работает, но консоль xcode продолжает запрашивать .indexOn для имени пользователя.

Почему здесь что-то не так?

Комментарии:

1. Пожалуйста, скопируйте текст правил безопасности в сам вопрос и отформатируйте его как код, вместо того, чтобы показывать картинку.

2. Мои извинения, все изменилось! Спасибо.

Ответ №1:

Индексы должны быть определены в том месте, где вы используете их в своем запросе. Итак, чтобы определить индекс на /users с username свойством каждого дочернего узла:

   "users" : {
    ".indexOn" : "username"
  }