Firestore поиск строки в массиве в документе - PullRequest
1 голос
/ 11 апреля 2020

Я хочу найти указанное c строковое значение в документе, который находится в массиве.

Вот моя база данных:

Databse

Это мой код на данный момент: но он возвращает 0 документов:

func changePhotoUrlInPosts(url: String) {

    let db = Firestore.firestore()
    let user = UserService.currentUserProfile!

    db.collection("posts")
        .whereField("username", isEqualTo: user.username)
        .getDocuments { (snapshot, error) in
            if let indeedError = error {
                print(indeedError.localizedDescription)
                return
            }

            guard let indeedSnapshot = snapshot else {
                print("snapshot is empty")
                return
            }

            for document in indeedSnapshot.documents {
                document.setValue(url, forKey: "photoUrl")
            }
    }
}

Как я могу go в мой массив в этом документе?

Спасибо

Ответы [ 3 ]

1 голос
/ 11 апреля 2020

На скриншоте показаны данные в базе данных реального времени, но ваш код запрашивает Firestore. Это совершенно разные базы данных с разными API. Вы не можете использовать Firestore SDK для запроса базы данных в реальном времени. Если вы хотите работать с базой данных реального времени, используйте документацию здесь .

0 голосов
/ 12 апреля 2020

Итак, я изменил свой код на:

func loadData(url: URL){

    let ref = Database.database().reference().child("posts")
    let user = UserService.currentUserProfile!

    ref.queryOrdered(byChild: "author/username").queryEqual(toValue: user.username).observe(.value, with: { snapshot in
        if var post = snapshot.value as? [String : Any] {
            print("updated all Posts")
            post.updateValue(url.absoluteString, forKey: "photoUrl")
            print(post.values)


        }else{
            print("fail")
        }
})

}

Все прошло, и я получил отчет о печати своих значений, но данные не изменились в базе данных реального времени

0 голосов
/ 12 апреля 2020

В вашей структуре данных есть поле author между posts и username. Ваш код означает, что прямо под каким-то конкретным c постом есть поле username.

Таким образом, такой код будет работать, потому что date right undes post:

db.collection("posts").whereField("date", isEqualTo: "some-bla-bla-date")

В вашем случае как я вижу, у вас есть два варианта:

  • дублировать username и поместить это поле на тот же уровень, что и date и guests.
  • , переписать свой код в отметьте username внутри author документа.

Надеюсь, это поможет вам в вашем расследовании.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...