我想创建一个按时间顺序的提要,它显示我关注的用户的帖子。我从Firestore获取帖子,但它们没有排序,因为它们是在不同的块中获取的,并且只有每个块都是有序的。此外,我真的不想在以后对帖子进行排序。
我想我需要一个更好的方法来获取数据,但我不知道怎么做。有人能帮我吗?
谢谢!
fetchPostsFromFollows: builder.query<any,
{ followedUsers: string[]; postsPerLoad: number }
>({
async queryFn(arg) {
const { followedUsers, postsPerLoad } = arg;
let usersArray = [...followedUsers, auth.currentUser.uid];
try {
const chunkSize = 10;
const followedUsersChunk = usersArray.reduce(
(resultArray, item, index) => {
const chunkIndex = Math.floor(index / chunkSize);
if (!resultArray[chunkIndex]) {
resultArray[chunkIndex] = []; // start a new chunk
}
resultArray[chunkIndex].push(item);
return resultArray;
},
[]
);
let postArray = [];
for await (const snap of followedUsersChunk.map(async (chunk) => {
const postRef = query(
collectionGroup(db, "userPosts"),
where("userId", "in", chunk),
orderBy("timestamp", "desc"),
limit(2)
);
const querySnapshot = await getDocs(postRef);
querySnapshot.forEach((doc) => {
postArray.push({
timestamp: doc
.data()
["timestamp"].toDate()
.toLocaleDateString("de-DE", dateFormatShort),
body: doc.data().body,
userId: doc.data().userId,
id: doc.id,
});
});
}));
return { data: postArray };
} catch (err) {
return { error: err };
}
},
providesTags: ["Posts"],
}),
1条答案
按热度按时间djmepvbi1#
这看起来像是你在依次检索每个用户的帖子。所以当你按时间顺序获取 * 每个 * 用户的帖子时,它们可能不会按时间顺序在 * 所有 * 用户之间排序。
如果你的用户ID少于30个,你可以一次性将它们全部传递给查询的
in
子句,从而获得所有文章的排序。请注意,这个限制最近从10增加到了30,看起来你仍然需要更新代码。如果您有超过30个用户,那么对于您当前的数据模型,除了在应用程序代码中分块加载然后重新排序文档之外,没有其他选择。
另一种方法是更改数据模型以适应您的用例,这是使用NoSQL数据库时的常见考虑因素。(例如
userFeed
),当有人写一篇文章时。这样写操作将花费更长的时间,并且您将有很多重复的数据,但是然后要读取当前用户的提要,现在可以查询单个集合。