firebase 如何跨多个查询按时间顺序从Firestore获取文档

vulvrdjw  于 2023-04-07  发布在  其他
关注(0)|答案(1)|浏览(123)

我想创建一个按时间顺序的提要,它显示我关注的用户的帖子。我从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"],
    }),
djmepvbi

djmepvbi1#

这看起来像是你在依次检索每个用户的帖子。所以当你按时间顺序获取 * 每个 * 用户的帖子时,它们可能不会按时间顺序在 * 所有 * 用户之间排序。
如果你的用户ID少于30个,你可以一次性将它们全部传递给查询的in子句,从而获得所有文章的排序。请注意,这个限制最近从10增加到了30,看起来你仍然需要更新代码。
如果您有超过30个用户,那么对于您当前的数据模型,除了在应用程序代码中分块加载然后重新排序文档之外,没有其他选择。
另一种方法是更改数据模型以适应您的用例,这是使用NoSQL数据库时的常见考虑因素。(例如userFeed),当有人写一篇文章时。这样写操作将花费更长的时间,并且您将有很多重复的数据,但是然后要读取当前用户的提要,现在可以查询单个集合。

相关问题