Firestore引用文档的最佳做法

时间:2019-11-20 22:01:47

标签: android firebase google-cloud-firestore

我正试图向用户展示他参与的项目(例如喜欢的帖子)。现在,我将用户文档(在用户集合中)存储在另一个集合中的 文档的 ID 帖子),当我想在回收站视图中显示它们时,我首先从用户文档中获取ID。然后我通过ID获取所有帖子。有什么解决方法,我可以在后文档的子集合中存储用户ID,然后获取 查询 所有 < / strong>喜欢/评论/由用户发出的帖子如何?因此,用户文档将不会引用帖子的ID,并且在帖子集合中,我可以执行以下操作:

Query ref = from db.collection("posts") get all posts where post.likedBy == user;

我不喜欢将所有喜欢该帖子的用户放入帖子文档中-用户下载所有ID。

posts (collection)
  -postID (post document)
   -authorID, ... (fields)

users (collections)
  -userID (user document)
    -string[] idsOfPosts (fields)

1 个答案:

答案 0 :(得分:1)

您应该使用Subcollections作为数据模型。

  

子集合中的文档也可以包含子集合,   允许您进一步嵌套数据。您最多可以嵌套100个数据   

您还可以使用collection group query从集合组而不是单个集合中检索文档。该链接为您提供了不同语言的示例代码片段。

编辑:

根据您在评论中提供的用例:

我想说的是您描述数据模型以使用户喜欢的所有帖子的方式,它需要在查询中进行查询。不确定它是否可行或有效。

这是我的建议: 建立类似于以下内容的数据模型 enter image description here

通过这种方式运行以下查询(我正在使用NodeJ),将为您提供所有user1喜欢的帖子。

let postsRef = db.collection('posts');

const user1 = postsRef.where('Liked', 'array-contains',
  'user1');

let query1 = user1.get()
  .then(snapshot => {
    if (snapshot.empty) {
      console.log('No matching documents.');
      return;
    }

    snapshot.forEach(doc => {
      console.log(doc.id, '=>', doc.data());
    });
  })
  .catch(err => {
    console.log('Error getting documents', err);
  });

输出:

enter image description here

编辑:(11/12/2019)

根据您在评论中描述的内容,以下是一个可能解决您的问题的想法:

您可以引用包含用户列表的文档,而不是拥有喜欢该帖子的用户列表。您可以根据需要引用任意数量的文档。

示例:

enter image description here

文档甚至可以位于不同的馆藏中。