Firestore: извлечение документов, которые не существуют в массиве, на основе геолокации и отношения «многие ко многим» - PullRequest
0 голосов
/ 20 января 2019

Я пытаюсь выполнить запрос с помощью Firestore, чтобы показать моему основному пользователю, близкому ему пользователю, что он еще не видел!
Давайте назовем эту функцию «getNearUsers», а моего основного пользователя - «toto».
Извините за длинный заголовок Я не смог найти более конкретный, но значимый заголовок.

Здесь оформление документа: user document

Like Tinder Toto может считывать пользователей, каждый зарегистрированный пользователь хранится в документе Toto, в массиве userId под названием «likes».Чтобы сделать запрос гео-точек и местоположения, я использую GeoFirestorejs в облачной функции Firebase.Это позволяет мне запрашивать пользователей на основании их «lastLocation».

Местоположение пользователей обновляется, после чего они используют приложение, поэтому для одного и того же пользователя каждый вызов «getNearUsers» может давать мне разных пользователей, даже если у них нет доступа.т «никто».

Здесь функция:

export const nearToMe = functions.https.onRequest(async (req, res) => {
  const firestore = admin.firestore();
  const collection = firestore.collection('users');
  let limitQuery =  collection.limit(50);
  const userId = req.body.userId;
  const geofirestore: GeoFirestore = new GeoFirestore(firestore);
  const geoUsersCollection: GeoCollectionReference = geofirestore.collection('users');
  const userDocs = await geoUsersCollection.where('userId', '==', userId).get();
  const user = userDocs.docs[0].data();
  const userLoc = user.lastLocation;
  const userLikes: Array<String> = user.likes;
  const matchList = Array<any>();
  if(req.body.startAfter){
      limitQuery = limitQuery.startAfter(req.body.startAfter);
  } 
  const query = new GeoQuery(limitQuery).near({
    center: new admin.firestore.GeoPoint(userLoc.latitude, userLoc.longitude),
    radius: 10000
  });
  const nearUsers = await query.get();
  nearUsers.docs.forEach(nearUser => {
    const nearUserId = nearUser.data().userId;
    if (userLikes.indexOf(nearUserId) < 0 && nearUserId != userId) {
        matchList.push(nearUser.data());
    }
  });
  res.send(matchList);
});

Я хочу ограничить количество пользователей, возвращаемых функцией, но я не могу сделать это во время запроса, потому что я не знаю, сколько пользователейМой пользователь уже «пролистал», не получив сначала список ближайших пользователей (основываясь на том факте, что в Firestore вы не можете найти элементы, которые НЕ находятся в массиве или не существуют).И это моя проблема.

Если я хочу отобразить 10 рядом с пользователями Toto, я должен запросить еще, чтобы иметь возможность иметь пользователей, которых Toto не видел в нем.Я мог бы использовать курсор запроса и сохранить его для поиска пользователей после этого курсора, но, как было сказано ранее, список пользователей «getNearUsers» может дать мне разных пользователей, список не будет одинаковым, порядок не будет ни.

В момент времени «getNearUsers» мог вернуть User1, User4.Таким образом, я получаю курсор на User4.Но при T + 1 функция может вернуть User2, User3, User 4 ... Таким образом, курсор будет бесполезен, потому что он не вернет 2 и 3. Верно?

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

Я немного растерялся и до сих пор не знаю, выполним ли такой вид запросов / запросов.легко в Firestore.Если вы думаете о лучшем моделировании документов, я буду рад изменить его.

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