首页 > 解决方案 > 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 中轻松实现。如果您想到更好的文档建模,我很乐意对其进行更改。

标签: javascriptfirebasegoogle-cloud-firestoregoogle-cloud-functions

解决方案


推荐阅读