Flutter Firestore扩展文档数据

时间:2019-02-08 08:30:46

标签: firebase flutter google-cloud-firestore

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

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

  • 购物类别
  • ShoppingItems

逻辑是,在ShoppingItems下,我可以存储所有商品,而不必考虑类别(例如牛奶,面包,家禽,葡萄酒等),但是在ShoppingCategories中,我创建了产品类别(例如日记,水果,肉类...)以及属于它们的参考项目。

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

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

class ShoppingItem {
    DocumentReference reference;
    String title;
}

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

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

我的确将获得所有具有属性items的购物类别;但是它将只是类型DocumentReference。为了对我来说,要检索这些ShoppingItem的详细信息,我将需要对Firestore进行其他调用(针对每个子项目)并请求其详细信息。

我的问题是:

有没有一种方法可以更有效地做到这一点?例如。如果使用的是Entity Framework,我将在我的.expand()集合上调用items方法,它将动态获取所有必要的详细信息-因此在一次调用中,我获得了所有详细信息。我可以在Flutter-Firestore中做类似的事情吗?

1 个答案:

答案 0 :(得分:2)

不,那不可能。 Firestore在设计上没有任何联接,客户端SDK也没有。

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

{}表示文档ID

shopping_categories/{dairy}
  {name: "Dairy"}

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

item中的数据字段是可选的,您也可以这样做:

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

这样,您可以像这样查询它:

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

通过将所有内容保存在一个文档中,您可以在一项操作中同时获得项目和类别。这通常比较便宜,特别是如果您只得到一件商品的话。

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