Я пытаюсь выполнить запрос с помощью Firestore, чтобы показать моему основному пользователю, близкому ему пользователю, что он еще не видел!
Давайте назовем эту функцию «getNearUsers», а моего основного пользователя - «toto».
Извините за длинный заголовок Я не смог найти более конкретный, но значимый заголовок.
Здесь оформление документа:
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.Если вы думаете о лучшем моделировании документов, я буду рад изменить его.