【问题标题】:Firestore best practice for refering to documentFirestore 引用文档的最佳实践
【发布时间】:2020-03-16 17:51:33
【问题描述】:

我正在尝试向用户展示他参与的项目(例如喜欢的帖子)。现在我存储在 user document(在 users 集合中)IDs of 来自另一个集合的文档(posts ),当我想首先在回收站视图中显示它们时,我会从用户文档中获取 ID。然后我通过 ID 获取所有帖子。是否有任何解决方法,我可以将用户 ID 存储在帖子文档的子集合中,然后 get query of all 喜欢/评论过/用户的任何帖子?因此,用户文档将不会引用帖子的 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)

【问题讨论】:

  • 我不太清楚您要在这里解决的问题。
  • @DougStevenson 我试图编辑问题
  • 仍不清楚。听起来您知道自己想做什么——将用户 ID 放入子集合中的文档中。你在哪里实施它?
  • @DougStevenson 我不知道,然后如何在其子集合中获取所有包含用户 ID 的文档(如查询)

标签: android firebase google-cloud-firestore


【解决方案1】:

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

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

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

编辑:

根据您在 cmets 中提供的用例:

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

这是我的建议: 构建类似于以下内容的数据模型

以这种方式运行以下查询(我正在使用 NodeJs)将为您提供 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);
  });

输出:

编辑:(2019 年 11 月 12 日)

根据您在 cmets 中的描述,这里有一个可以解决您问题的想法:

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

例子:

文档甚至可以在不同的集合中。

【讨论】:

  • 我以前看过这个例子,但我不确定它是否对我的情况有用,因为我会将喜欢该帖子的用户存储在该子集合中,但我对用户感到好奇,但我对上面的文件=帖子。所以我必须在得到结果后检索父文档。我明白了,没有更清晰的方法可以做到这一点。
  • 请清楚说明您想要达到的目标,以便我进一步帮助您。我不确定您想要获得的结果到底是什么。
  • 问题:是否可以在单个查询中获取用户喜欢的所有帖子文档?如果是这样,如何。
  • @Zolo 我已经根据您在 cmets 中描述的内容更新了答案。
  • 但问题是,该文档只能有 1MB,因此如果有更多用户,则必须将其存储在其他地方...当我下载该文档时,我是否必须始终下载所有喜欢的用户是吗?
猜你喜欢
  • 1970-01-01
  • 2019-06-07
  • 1970-01-01
  • 2011-10-31
  • 1970-01-01
  • 2021-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多