Фильтрация геохеша запросов Firestore

Вопрос-запрос Firestore. В моем документе есть поле "геохеш", по которому я хочу выполнить фильтрацию. Я видел видео Фрэнка @puf о получении круговых геохешей на yt. На данный момент меня пока не интересует циклический запрос. У меня есть геохеш для пользователя. И много 10 точных геохешей, которые я хочу отфильтровать.

let userGeohash = "c2b2qd"
documentRef.whereField("geohash", isGreaterThanOrEqualTo: userGeohash)

Я ожидал, что этот запрос вернет любой геохеш, который лучше, чем userGeohash. Но то, что возвращается, не будет.

input = "c2b2qd"
expected output:
"c2b2qdh7rs"
"c2b2qdh2ht"
"c2b2qd3etr"

Но мне ничего не вернули ... Моя логика, должно быть, узкое место ..  введите описание изображения здесь

ПРИМЕР КОДА:

docRef.whereField("geohash", isGreaterThanOrEqualTo: "c2b2qdd").getDocuments { (query, error) in
            query?.documents.forEach({ (snapshot) in
                let data = snapshot.data()
                print(data["geohash"] as! String)
            })
        }


// returns the following :
c2b2qddkc3q
c2b2qddkdcm
c2b2qddpydb
c2b2qehqtkg
c2b2qey3dje
c2b2qey4e62
c2b2qey4em1
c2b2qkp7cm0
u1hg7pzxs26


// expected output: 
c2b2qddkc3q
c2b2qddkdcm
c2b2qddpydb

Я даже пробовал использовать «aaaaaaaa» в качестве своего фильтра, который также возвращает все документы.


person arvidurs    schedule 23.05.2019    source источник
comment
Код выглядит нормально, поэтому проблема, скорее всего, в данных. Добавьте снимок экрана (или JSON data()) документа, который, по вашему мнению, следует вернуть.   -  person Frank van Puffelen    schedule 24.05.2019
comment
Привет, Фрэнк - Может быть, это как-то связано с запросом, возможно ли, что он просто проверяет строки, равные / большой длине счетчика символов, и не проверяет каждое строковое значение?   -  person arvidurs    schedule 24.05.2019
comment
Не должно быть. Вы можете протестировать, например, для поиска documentRef.whereField("category", isGreaterThanOrEqualTo: "soc").   -  person Frank van Puffelen    schedule 24.05.2019
comment
хорошо, я сделаю еще один шанс. Благодарность!   -  person arvidurs    schedule 24.05.2019
comment
обновлен примером кода @FrankvanPuffelen   -  person arvidurs    schedule 24.05.2019


Ответы (1)


Вы, кажется, неправильно понимаете запросы Firebase. Ваш запрос возвращает открытый диапазон:

docRef.whereField("geohash", isGreaterThanOrEqualTo: "c2b2qdd")

В частности, этот запрос открывает индекс по geohash, который упорядочен лексикографически, он находит первую запись, которая начинается с c2b2qdd (или больше), а затем возвращает все результаты с этой точки. Это включает такие результаты, как c2b2qehqtkg, поскольку они больше или равны.

Если вы хотите имитировать операцию типа start with, вам необходимо использовать запрос закрытого диапазона, который также включает конечное условие диапазона.

docRef.whereField("geohash", isGreaterThanOrEqualTo: "c2b2qdd")
      .whereField("geohash", isLessThan: "c2b2qde")

Это возвращает все документы, в которых есть поле geohash, которое начинается с c2b2qdd.

person Frank van Puffelen    schedule 24.05.2019
comment
Спасибо за разъяснение! Я отмечу это после проверки. - person arvidurs; 24.05.2019
comment
Еще раз спасибо, Фрэнк, вот и все. Это не слишком точно, но достаточно хорошо для моего случая использования - person arvidurs; 25.05.2019
comment
docRef.whereField (geohash, isGreaterThanOrEqualTo: abcd) .whereField (geohash, isLessThan: abcd ~), который возвращает все в блоке 20k. БЛАГОДАРНОСТЬ - person arvidurs; 25.05.2019