我有一个简单的应用程序,使用Firestore作为数据源。在遵循了Google关于如何构建更好的数据库的教程之后,我开始将我的对象分成多个表(或它们如何称为集合)并使用数据引用。
让我给你一个简单的例子。假设我有两个集合(数据表)
逻辑是,在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中做类似的事情吗?
答案 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();
通过将所有内容保存在一个文档中,您可以在一项操作中同时获得项目和类别。这通常比较便宜,特别是如果您只得到一件商品的话。
这是文档数据库的一个优点,您可以以一种更有效的读取方式保存文档,因为您只需要读取一个实体而不是多个实体。