Чтение данных из Firestore - PullRequest
0 голосов
/ 01 июля 2019

Я создаю приложение, в котором пользователь может создать событие и просматривать другие события, созданные другими пользователями, только если они находятся в радиусе 10 км. Я храню все данные в FireStore.

Так работает приложение, со стороны пользователя выбираются все события и отображаются только те события, расстояние которых меньше 10 км.

Проблема в том, что если в базе данных есть 10 000 событий, а пользователь находится в радиусе 10 км только 10 событий, то, очевидно, он будет учитываться как 10000 читает, что слишком дорого.

Есть предложения по этой проблеме? Одно из решений, которое я имею в виду, - это хранить данные в соответствии с географической областью, но как их реализовать - это другая проблема.

Ответы [ 3 ]

0 голосов
/ 01 июля 2019

Вы не будете платить за 10 000 операций чтения, но только за документы, полученные по вашему запросу, в вашем примере - десять.

Вот хорошее видео от Firebase, объясняющее их биллинговую систему: https://www.youtube.com/watch?time_continue=224&v=6NegFl9p_sE

Также имейте в виду, что для запросов, отличных от чтения документов, таких как запрос списка идентификаторов коллекции, выставляется счет за один прочитанный документ.

0 голосов
/ 04 июля 2019

Я предлагаю рассчитать минимальную и максимальную долготу, соответствующие расстоянию в 10 км от пользовательской долготы.Вы делаете то же самое с широтой и используете эти ограничения в запросе Firestore.При этом у вас будет меньше событий / считываний, и вы сможете рассчитать точное расстояние для подавления событий в радиусе от 10 до 14 км ... при необходимости.

Чтобы рассчитать свой лимит, вы можете использовать следующую формулу из https://www.movable -type.co.uk / scripts / latlong.html (пункт назначения с учетом расстояния и направления от начальной точки) иесть онлайн калькулятор JavaScript, который вы можете изучать.

φ2 = asin (sin φ1 ⋅ cos δ + cos φ1 ⋅ sin δ ⋅ cos θ)

λ2 = λ1 + atan2 (sin θ ⋅ sinδ ⋅ cos φ1, cos δ - sin φ1 ⋅ sin φ2)

где φ - широта, λ - долгота, θ - азимут (по часовой стрелке с севера), δ - угловое расстояние d / R;d - расстояние, пройденное в метрах, R - радиус Земли (6371e3).

С азимутом 0 ° вы получите LatitudeMax

С азимутом 90 ° вы получите долготуВосточный

С азимутомНа 180 ° вы получите LatitudeMin

С азимутом 270 ° вы получите долготу на западе

Поскольку земля представляет собой сферу с долготой от -180 ° до 180 °

longitudeMin = Min (longitudeEast,longitudeWest)

longitudeMax = Max (longitudeEast, longitudeWest)

И часть Firestore выглядит так:

CollectionReference col = Firestore.instance.collection("mycollection");

Query latitudeMinQuery = col.where('latitude', isGreaterThan: LatitudeMin);
Query latitudeMaxQuery = latitudeMinQuery.where('latitude', isLessThan: LatitudeMin);
Query longitudeMinQuery = latitudeMaxQuery.where('longitude', isGreaterThan: LongitudeMin);
Query longitudeMaxQuery = longitudeMinQuery.where('latitude', isLessThan: LongitudeMax);
0 голосов
/ 01 июля 2019

https://stackoverflow.com/a/43804487/9139407 (ответы @ alex-mamo)

Надеется, это поможет!

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