firestore.where () на двух полях одновременно - PullRequest
1 голос
/ 06 июня 2019

У меня есть коллекция пожарных из следующих документов:

[
  {
    start:       { geohash: 'u3qchtmpuy2d' },
    destination: { geohash: 'u3qcjvxfh9cs' },
    timestamp:   '28 June 2019 at 20:24:00 UTC+2',
    ...
  }
]

и я попытался запросить его вот так (его Firestore Web SDK)

// 5-characters geohash is 4.89km × 4.89km
const start = 'u3qch';
const destination = 'u3qcj';
const timestamps = {
  min: firestore.Timestamp.fromDate(
    moment(someDateTime).subtract(10, 'minutes').toDate()
  ),
  max: firestore.Timestamp.fromDate(
    moment(someDateTime).add(10, 'minutes').toDate(),
  ),
};

firestore
  .collection('deliveries')
  .where('start.geohash', '>=', start)
  .where('start.geohash', '<', geohashEnd(start))
  .where('destination.geohash', '>=', destination)
  .where('destination.geohash', '<', geohashEnd(destination))
  .where('timestamp', '>=', timestamps.min)
  .where('timestamp', '<', timestamps.max)
  .get()

комбинация >= и < из Firestore: запрашивать документы по запускам со строкой , следовательно, функция geoHashEnd() (выходит за рамки этого вопроса).

Это привело к следующей ошибке:

FirebaseError: Неверный запрос . Все, где фильтры с неравенством (<, <=,> или> =) должны находиться в одном поле. Но у вас есть фильтры неравенства для start.geohash и destination.geohash

Мой вопрос: каков наилучший подход для запроса моей коллекции firestore сразу по двум строкам геохеша и дополнительному полю?

1 Ответ

2 голосов
/ 06 июня 2019

Согласно официальной документации, касающейся ограничений запроса :

Ограничения запроса

Cloud Firestore не поддерживает следующие типызапросы:

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

Итак, как вы можете видеть, Cloud Firestore может только сделать фильтр диапазона на одном поле, а не на нескольких полях, как вы планировали.Наиболее разумным объяснением является то, что Firestore не может гарантировать свою производительность в этом случае.Firestore должен иметь возможность возвращать все результаты запроса в одном потоке.

Чтобы решить эту проблему, вам придется дважды выполнить запрос к базе данных и объединить результаты этих запросов на стороне клиента.Это не идеально, так как вам нужно сделать запрос дважды, но я думаю, что это сработает.

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

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