Как запросить все геозапросы в заданном радиусе с помощью geofirestore?

Я пытаюсь сделать запрос к облачному хранилищу, которое должно вернуть все геоточки в радиусе, скажем, 10,5 км от данной геоточки. Я пытаюсь использовать geofirestore для достижения этой цели. Я пытался использовать геозапросы, но не могу найти метод или свойство, которое возвращает это. На мой вопрос кажется, что у него довольно простой ответ, но я новичок как в firebase, так и в geofirestore. Спасибо.

Мой код до сих пор:

document.addEventListener('DOMContentLoaded', () => {
    const app = firebase.app();
});

var db = firebase.firestore();

db.settings({
    timestampsInSnapshots: true
});

const collectionRef = firebase.firestore().collection('geofirestore');

// Create a GeoFirestore index
const geoFirestore = new GeoFirestore(collectionRef);

const post1 =  db.collection('posts').doc('firstpost');

const test = {lat: 39.369048, long: -76.68229}

const geoQuery = geoFirestore.query({
    center: new firebase.firestore.GeoPoint(10.38, 2.41),
    radius: 10.5,
    query: (ref) => ref.where('d.count', '==', '1')
});

console.log(geoQuery.query());

person Binyamin Green    schedule 29.10.2018    source источник


Ответы (1)


Я думаю, что документация может быть неясной, но вот что происходит.

Код ниже создает GeoFirestoreQuery:

const geoQuery = geoFirestore.query({
    center: new firebase.firestore.GeoPoint(10.38, 2.41),
    radius: 10.5,
    query: (ref) => ref.where('d.count', '==', '1')
});

Если вы хотите сделать геозапрос, вы должны использовать прослушиватель on для события key_entered, которое вернет документы в вашем запросе, см. здесь.

Однако вы вызываете функцию query, которая возвращает запрос Firestore или CollectionReference (в зависимости от того, передали ли вы функцию запроса при создании или обновлении критериев запроса).

Вызов get на этом query ОБХОДИТ всю магию GeoFirestore и не даст вам того, что вы хотите или ожидаете... Вместо этого вы захотите сделать что-то подобное.

// Store all results from geoqueries here
let results = [];

// Create geoquery
const geoQuery = geoFirestore.query({
    center: new firebase.firestore.GeoPoint(10.38, 2.41),
    radius: 10.5,
    query: (ref) => ref.where('d.count', '==', '1')
});

// Remove documents when they fall out of the query
geoQuery.on('key_exited', ($key) => {
  const index = results.findIndex((place) => place.$key === $key);
  if (index >= 0) results.splice(index, 1);
});

// As documents come in, add the $key/id to them and push them into our results
geoQuery.on('key_entered', ($key, result) => {
  result.$key = $key;
  results.push(result);
});
person MichaelSolati    schedule 06.11.2018
comment
Итак, «key_exited» не является прослушивателем событий? благодарю вас. - person Binyamin Green; 06.11.2018
comment
key_exited — это прослушиватель событий, и вы сможете найти его в примере, это чертовски полезно! = Д - person MichaelSolati; 08.11.2018
comment
У меня есть такой же код, и иногда он работает, а иногда выдает ошибку: Ошибка: функция вышла из-под контроля запроса. Вызов функции был прерван. Разве не должно быть где-то ожидание? - person Osama; 09.12.2018
comment
Ожидание не требуется, если вы покажете какой-то код или, может быть, поделитесь сутью, я могу взглянуть на него. - person MichaelSolati; 09.12.2018