【问题标题】:Flutter Firestore expand document dataFlutter Firestore 展开文档数据
【发布时间】:2019-02-08 08:30:46
【问题描述】:

我有一个使用 Firestore 作为数据源的简单应用。在学习了谷歌关于如何构建更好的数据库的教程之后,我开始将我的对象分成多个表(或者他们如何称之为集合)并使用数据引用。

让我举一个简单的例子。假设我有两个集合(数据表)

  • 购物类别
  • 购物项目

逻辑是,在ShoppingItems 下我可以存储所有物品,无论类别如何(例如牛奶、面包、家禽、葡萄酒……),但在我的ShoppingCategories 中我创建产品类别(例如日记、水果, Meat, ...) 和属于他们的参考项目。

这是数据模型在 Flutter 中的样子:

class ShoppingCategory {
    DocumentReference reference;
    String title;
    List<ShoppingItem> items;
}

class ShoppingItem {
    DocumentReference reference;
    String title;
}

我现在面临的问题是,如果我执行以下调用:

Firestore.instance.collection('shopping_categories').snapshot()

我确实会得到属性为items 的所有购物类别;但是它将只是DocumentReference 类型。为了让我检索这些 ShoppingItems 的详细信息,我需要额外致电Firestore(针对每个子项目)并索取他们的详细信息。

我的问题是:

有没有办法更有效地做到这一点?例如。如果我使用的是实体框架,我会在我的items 集合上调用.expand() 方法,它会动态获取所有必要的细节——所以在一次调用中我得到了所有的细节。我可以在 Flutter - Firestore 中做这样的事情吗?

【问题讨论】:

    标签: firebase flutter google-cloud-firestore


    【解决方案1】:

    不,这是不可能的。 Firestore 没有设计连接,客户端 SDK 也没有。

    如果您需要在一次操作中获取所有项目和类别,我会这样建模:

    {} 表示文档 ID

    shopping_categories/{dairy}
      {name: "Dairy"}
    
    items/{milk}
      {
        category: {
          id: "dairy",
          data: {name: "Dairy"}
        },
        name: "Milk"
      }
    

    items中的data字段是可选的,你也可以这样:

      {
        category: {
          id: "dairy",
          name: "Dairy"
        },
        name: "Milk"
      }
    

    这样你就可以这样查询了:

    Firestore.instance.collection('items').where('category.id', isEqualTo: "dairy").getDocuments();
    

    通过将所有内容保存在一个文档中,您可以在一次操作中同时获取项目和类别。这通常更便宜,特别是如果您只购买一件商品。

    这是文档数据库的一个优点,您可以以一种读取效率更高的方式保存文档,因为您只需要读取一个实体而不是多个实体。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-26
      • 2021-06-17
      • 2020-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-20
      • 2019-07-22
      相关资源
      最近更新 更多