我坚持在firestore中获取数据结构。我只能满足#1的要求。请帮助我。
要求:
显示最新的k个帖子,不论用户是什么(整个数据库中最新的k个帖子)
显示与多个用户相对应的帖子(与我关注的用户对应的帖子)
以下是我能想到的两种数据结构,但仍然无法满足第二项要求。
/posts/{postId}/
-authorId //one among /users/{userId}
-message
-date
/users/{userId}/
-name
-etc...
Req1:显示最新的k个帖子,无论用户是什么
constructor(private afs: AngularFirestore) {}
// code to fetch latest k posts
this.afs.collection("posts").ref
.orderBy("date", "desc")
.limit(k)
.get().then(snapshot => {
snapshot.forEach(postDoc => {
console.log(postDoc.data());
// rest of the code
});
});
Req2:显示与多个用户对应的帖子 问题:在上面的代码中,如果我添加一个"其中"方法,它只能过滤一个authorId,而不能过滤多个。 例如
this.afs.collection("posts").ref
.where("authorId" == "xyz...")
.orderBy("date", "desc")
.limit(k)
/users/{userId}/
-name
-etc...
/posts/{postId}/ (collection inside user document)
-message
-date
不确定,但我认为数据结构比数据结构1更有效,因为在查找与我关注的用户相对应的帖子时,不需要搜索整个帖子集合,而只是查看发布您正在关注的用户的收集。 问题:如何在上述数据结构中获取最新的k帖?
答案 0 :(得分:0)
您应该毫不犹豫地在数据库中维护两个数据结构。这在NoSQL数据库中称为“非规范化”(通过反对众所周知的SQL DB规范化)是一种非常经典的方法。
看看这个解释NoSQL数据库的“数据建模技术”的article并说“非规范化可以定义为将相同数据复制到多个文档或表格以简化/优化查询处理或以使用户的数据适合特定数据模型“。
缺点是您必须保持两个结构同步,但这可以通过Firestore中的批量写入轻松完成,请参阅此处的文档https://firebase.google.com/docs/firestore/manage-data/transactions#batched-writes