我必须从 firestore 数据库获取平均评分最高的 3 本书的图书 ID

问题描述 投票:0回答:1

附件是firebase的参考资料

我将数据保存为此处 在此输入图片描述

    const productRef = await addDoc(collection(db, `rating_book/${product.bk_ID}/ratings`), {
      bookId: product.bk_ID,
      date: Timestamp.now(),
      rating: rating,
      token: JSON.parse(localStorage.getItem('user')!).token,
      username: JSON.parse(localStorage.getItem('user')!).username
    });

这是来自 firebase 的完整图片的另一个快照。 在此输入图片描述

我正在尝试获取数据,但我没有在这里获取数据。为什么?

  const fetchTopRatedBookIds = async() => {
    try {
      const ratingsSnapshot = await getDocs(collection(db, 'rating_book'));
      const bookRatings: { [bookId: string]: number[] } = {};
  
      await Promise.all(ratingsSnapshot.docs.map(async (doc) => {
        const ratings = doc.data().ratings as number[];
        bookRatings[doc.id] = ratings;
        console.log(`Book ID: ${doc.id}, Ratings: ${ratings}`);
      }));
  
      const averageRatings = Object.entries(bookRatings).map(([bookId, ratings]) => ({
        bookId,
        averageRating: ratings.reduce((acc, curr) => acc + curr, 0) / ratings.length,
      }));
  
      console.log('Average Ratings:', averageRatings);
  
      const sortedBooks = averageRatings.sort((a, b) => b.averageRating - a.averageRating).slice(0, 3).map(entry => entry.bookId);
      console.log('Sorted Books:', sortedBooks);
  
      return sortedBooks;
    } catch (error) {
      console.error('Error fetching details', error);
      return [];
    }
  };

如有任何建议,我们将不胜感激。

firebase google-cloud-firestore
1个回答
0
投票

您的代码正在将文档添加到嵌套在

ratings_book
内的文档下的称为(评级)的单个子集合中:

addDoc(collection(db, `rating_book/${product.bk_ID}/ratings`)

这些

ratings
子集合与
rating_book
完全不同。

您的查询仅考虑直接位于

rating_book
中的文档,而不是嵌套集合:

await getDocs(collection(db, 'rating_book'))

此查询始终不会返回任何文档,因为

rating_book
集合中没有直接的文档。

Firestore 查询很浅,不考虑嵌套子集合。

如果要查询评级子集合中的所有文档,则需要使用集合组查询

await getDocs(query(collectionGroup(db, 'rating_book')))

要么,要么根本不将文档添加到嵌套子集合中,而是对所有文档使用单个集合。

© www.soinside.com 2019 - 2024. All rights reserved.