Проблема с заказом поиска в firestore с помощью Swift - PullRequest
0 голосов
/ 28 мая 2020

У меня возникли проблемы с быстрым получением правильного порядка из запроса firestore.

func firestoreSearch() {

  let db = Firestore.firestore()

  myObjects.forEach( {j in
    print(j.id)
    db.collection("users").whereField("objectID", isEqualTo: j.id).getDocuments() { (querySnapshot, err) in
      if let err = err {
        print("Error getting search results: \(err)")
      } else {

        for i in querySnapshot!.documents {

          print("\(i.documentID)")

          let id = i.documentID
          let title = i.get("title") as! String
          let price = i.get("price") as! String
          let imageURL = i.get("imageURL") as! String
          let phoneNumber = i.get("phoneNumber") as! String
          let classUsed = i.get("classUsed") as! String
          let uid = i.get("uid") as! String
          let condition = i.get("condition") as! String
          let location = i.get("location") as! String
          let author = i.get("author") as! String
          let description = i.get("description") as! String
          let date = i.get("date") as! String


          self.searchResults.append(datatype1(id: id, title: title, price: price, imageURL: imageURL, phoneNumber: phoneNumber, classUsed: classUsed, uid: uid, condition: condition, location: location, author: author, description: description, date: date))
        }
      }
    }
  })
}

В приведенном выше коде терминал выводит следующее:

ZT5wne5djpZB5okgo1J0

PDE6eftBQs5ZKnBVGyBF

fQYGzEDIJUS6mgL3oKCz

0p8Rh7dgniN5V9tDdVzG

PDE6eftBQs5ZKnBVGyBF

ZT5wne5djpZB5okgo1J0

0p8Rh7dgniN5V9tDdVzG

fQYGzEDIJUS6mgL3oKCz

В коллекции 4 документа. Почему последние 4 идентификатора напечатанных документов расположены не в том же порядке, что и первые 4. Я использую Algolia для сортировки результатов, а затем передаю их этой функции, поэтому мне нужно, чтобы они оставались в том же порядке.

1 Ответ

0 голосов
/ 28 мая 2020

Похоже, ваш forEach l oop печатает идентификаторы документов в первых 4 строках в том порядке, в котором они появляются в массиве myObject (из вашего вопроса не ясно, как этот порядок установлен), и последние 4 строки печатаются после завершения вашего запроса. Фактически вы выполняете 4 отдельных запроса, и каждый запрос представляет собой отдельный запрос asyn c, поэтому нет гарантии, что порядок будет таким же.

Что вы можете сделать, так это сделать запрос, который возвращает все документы, которые вы хотите, в одном запросе:

func firestoreSearch() {

  let db = Firestore.firestore()

  let ids = myObjects.map { $0.id }

  db.collection("users")
    .whereField("objectID", in: ids)
    .getDocuments() { (querySnapshot, err) in

       for i in querySnapshot!.documents {
          print("\(i.documentID)")
          //...
       } 
    }
}

Отказ от ответственности: я не знаком с Firestore, поэтому это только из их документации whereField(_:in:).

Я не уверен, что они будут в том порядке, в котором указываются идентификаторы (скорее всего, нет), поэтому вам нужно будет использовать другой параметр сортировки или сопоставить сортировку в массиве myObjects.

...