Я на самом деле использую Firestore и предполагаю, что у меня более 100 тыс. Пользователей.
Вот модель Firestore, которая у меня есть на самом деле:
/users/
{uid_0}
/bans/
uid_1: true
uid_2: true
{uid_1}
/bans/
{uid_2}
/bans/
uid_4 : true
{uid_3}
/bans/
{uid_4}
/bans/
uid_0: true
Каждый пользователь может запретить N пользователей, и нам нужно прекратить любое взаимодействие между заблокированными пользователями.
Поэтому мне нужно создать облачную функцию, которая будет возвращать разные результаты для каждого пользователя.
[GET] / me / allow-users ( каждый пользователь будет использовать свой собственный токен)
uid_0 получит: [uid_3]
uid_1: [uid_2, uid_3, uid_4]
uid_2: [uid_1, uid_3]
uid_3: [uid_0, uid_1, uid_2, uid_4]
uid_4: [uid_1, uid_3]
Как использовать Firestore, каков наилучший способ реализовать это?
Это также может быть сделано на стороне клиента, но для этого потребуется, чтобы каждый пользователь синхронизировал c всех 100k пользователей ...
Вот код, который я пробовал на стороне клиента:
function getUsersSample() {
// Array of uid: /users/{uid}/bans/*
const bannedUsers = getBannedUsers();
// Considering we don't need rules for the moment
const usersCollection = Firebase.firestore().collection('users');
return usersCollection
.orderBy('last_activity_at', 'desc')
.limit(50)
.get()
.then((querySnapshot) => {
return querySnapshot.docs
.filter((e) => !bannedUsers.includes(e.id))
.map((e) => e.id);
});
}
Используя этот метод, я не всегда могу получить 50 пользователей в результате ...
Спасибо,