javascript - Firestore:根据地理位置和多对多关系检索数组中不存在的文档
问题描述
我正在尝试使用 Firestore 进行查询,以向我的主要用户显示,用户靠近他,他还没有看到!
让我们将该函数称为“getNearUsers”,我的主要用户称为“toto”。
抱歉,标题太长了,我找不到更具体但更有意义的标题。
就像 Tinder Toto 可以刷用户一样,每个刷过的用户都存储在 Toto 文档中,在一个名为“喜欢”的 userId 数组中。为了使地理点和位置可查询,我在 Firebase 云函数中使用 GeoFirestorejs。这允许我根据用户的 « lastLocation » 查询用户。
用户位置会在他们使用应用程序后更新,因此对于同一个用户,每次调用 «getNearUsers» 可以给我不同的用户,即使 toto 没有«滑动»没有人。
这里的功能:
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 中,您找不到不在数组中或不存在的项目)。这是我的问题。
如果我想向 Toto 显示 10 个附近的用户,我必须查询更多才能拥有一些 Toto 没有在其中看到的用户。我可以使用查询光标并将其保存在此光标之后搜索用户,但就像前面所说的,«getNearUsers»的用户列表可以给我不同的用户,列表不会相同,顺序也不会.
在 T 时刻,«getNearUsers» 可以返回 User1、User4。所以我在 User4 上找到了一个光标。但是在 T+1 时,func 可以返回 User2、User3、User 4……所以光标将无用,因为它不会返回 2 和 3。对吗?
并且更多的 Toto 刷卡用户,他的列表变得更大,我的查询需要检索大量数据以确保能够向 Toto 显示用户,或者作为替代方案,我可以使用光标启动多次查询,直到我得到了适当数量的用户......但问题仍然存在。
我有点迷茫,仍然不知道这种需求/查询是否可以在 Firestore 中轻松实现。如果您想到更好的文档建模,我很乐意对其进行更改。
解决方案
推荐阅读
- xamarin.android - Xamarin.Android如何限制编辑文本字段只允许小数点前1个数字和小数点后2个数字?
- delphi - TChart 问题:我的条形图的条形应该均匀分布而不是重叠
- java - 处理索引 0 超出长度 0 的范围以验证用户方法
- php - 如何回显警报?
- wordpress - Wordpress 站点完成从一台服务器到另一台 wordpress 的迁移
- r - r闪亮应用程序中基于当前周的上周总和值
- android - 为什么 Navigator pushNamedAndRemoveUntil 没有按预期工作?
- postgresql - 我无法在 pgadmin 4 v4 中运行服务器
- python - LightGBM 错误:ValueError:对于提前停止,评估需要至少一个数据集和评估指标
- java - 从字符串数组生成所有可能的组合而不重复