当前位置: 首页 > 知识库问答 >
问题:

获取父母从火收集组查询,没有找回儿子

袁奇文
2023-03-14

我正在设计一个Firestore数据库,我想知道以下架构的成本影响。。。

遵循Cloud FiRecovery教程,让我们想象一下这个架构:“餐厅”集合有一个“评论”子集合。类似于:

--Restuarants
   --My Restaurant
      --Reviews
         --My Review 1, through n

我对查询评论子集合感兴趣,但我对评论本身并不真正感兴趣,而是对餐馆感兴趣。

例如,在一个查询中,比如在2019年8月1日发布所有评论,我实际上对那些在2019年8月1日至少发布了一篇评论的餐厅感兴趣。我想拿回餐馆的文件,而不是评论。

从这篇文章和这篇文章来看,我的实现可能看起来像这样:

    QuerySnapshot myQuerySnapshot = await Firestore.instance.collectionGroup('reviews')
                .where('reviewDate', isEqualTo: '20190801').snapshots().first;
    List<DocumentSnapshot> myDocumentSnapshots = myQuerySnapshot.documents;

    myDocumentSnapshots.asMap().forEach((index, son) {
          snapshot.reference.parent().parent().get().then((parent) {
            print("Printing snapshot: $index");
            print("son id: "+son.documentID);
            print("parent id: "+parent.documentID); //I could then retrieve the parent data.
            });
    });

通过这种实现,我将获取所有的“儿子”(即。所有的评论)。这有几个缺点:

  • 成本。比如说,一家餐馆可能在2019年8月1日发布了1000条评论;我将被收取1001次阅读的费用(1000条评论是我感兴趣的实际父文档)。
  • 数据消耗。我的用户会从服务器中检索到比实际需要的更多的数据。

有更好的方法吗?有没有办法避免获取评论而只获取父文档?

谢谢

共有1个答案

庞彬
2023-03-14

当您查询评论集合时,无法返回餐厅。因此,您正在做的是在不更改数据模型的情况下获取餐厅的唯一方法。

像往常一样,在处理非关系型数据库时,修改您的数据模型以更好地适应这种用例可能会更好。我能想到的快速替代方案是在餐厅文档中保留一个数组datesWith Review,每当您向该餐厅的评论子集合添加评论时,您都会更新该文档。如果您使用array-Union操作来更新数组,则每当为日期添加评论时,您都可以更新餐厅,而不会在数组中出现重复的日期。

通过每个餐厅文档中的该字段,您可以查询包含该日期的所有餐厅。如果将日期存储为简单的“2020-07-19”字符串,则该查询如下所示:

firebase.firestore().collection("restaurants").where("reviewDates", "array-contains", "2020-07-19")

这与在交易中写入数据的FriendlyEats codelab步骤中添加评论时更新餐厅评级的方式类似。另请参见该步骤的视频演练。

 类似资料:
  • 问题内容: 我有一个视图vwGetData,它从两个表t1,t2中获取数据并具有字段: 我将在下面提供输入 我想在C#/ SQL中获得以下输出 或者 我想使用C#和SQL做到这一点。 问题答案: 您要做的第一件事是确保没有数据被返回: 现在假设您知道如何设置一个DataReader,您将执行以下操作: 您也可以查看SQL Catalog SYS视图。

  • 我是使用Android Studio和FiRecovery DB的新手。我正在尝试将几行文本从fiRecovery加载到我的android应用程序中。我在调试时注意到Equalto字段名称的代码行没有读取所需的数据。我不知道我在获取数据时哪里出错了。任何帮助都将不胜感激。这是我的代码。 查看活动。班 我nformation.class 这是我在firestore控制台上的数据截图

  • 问题内容: 在我的代码中,我正在使用。 然后,我执行该方法以填充准备好的语句的通配符。 在调用该方法并执行查询之前,我是否有办法检索(并打印出)最终查询?我只想将此用于调试目的。 问题答案: 这在JDBC API合同中没有定义,但是如果幸运的话,有问题的JDBC驱动程序可以通过调用来返回完整的SQL 。即 以我的经验,至少这样做是PostgreSQL 8.x和MySQL 5.x JDBC驱动程序。

  • 问题内容: 有两个SQL表: 我想用单个查询从Parents表中选择每一行,并从Childs表中为具有关系“ parent”-“ id”值和最大“ feature”列值的每一行选择一个查询。在此示例中,结果应为: 其中p =父表,c =子表 我试图离开外部联接和GROUP BY,但是MSSQL Express告诉我,使用GROUP BY进行查询需要在每个非Groupped字段上使用聚合函数。而且我

  • 问题内容: 我有一个简单的MySQL表,其中包含类别列表,级别由parent_id确定: 我正在尝试进行面包屑跟踪。因此,我有孩子的“身份证”,我想让所有可用的父母(重复链,直到我们达到0“家”)。可能有任意数量或子行达到无限深度。 目前,我正在为每个父母使用SQL调用,这很麻烦。SQL中有一种方法可以对一个查询执行全部操作吗? 问题答案: 从这里改编: 该行是当前页面的页码。结果如下:

  • 问题内容: 最初,我一直在尝试获取父母的名单以及每个父母的一个最近的孩子。我已经知道如何使用以下查询 但是问题是,结果不包括没有孩子的父母。添加也无济于事。所以我想我可以对所有没有孩子的父母进行查询,然后将这两个查询合并为一个查询。但是我在建立这样的查询时遇到了麻烦。将不胜感激任何建议。 问题答案: 这是您的查询: