-2

我是 firebase cloud firestore 的新手,需要一些帮助来理解它。

我正在从事以下结构的项目。firebase firestore 集合截图

firebase firestore 子集合截图

每个“餐厅”文档都包含自己的“产品”子集合。

在这里,我想运行一个查询,以获取不同餐厅的所有产品,这些产品包含标签“咖啡”并且使用特定的 Pincode“234144”。

我尝试通过向特定餐厅拥有的每个产品添加 Pincode 来尝试收集组查询,但更改 Pincode 会花费很多,因为我猜所有产品都必须进行编辑。

是否有任何有效的方法可以做到这一点,或者在这个数据库中以一种有效的方式是不可能的?

请让我知道您的想法...谢谢。

4

1 回答 1

1

如果我理解正确,您想检索具有特定标签和密码的所有产品(我想这类似于邮政邮政编码?)。我真的只有两种选择:

集合组查询

正如您所提到的,您可以在产品文档中存储标签密码。然后按照这些行执行单个集合组查询(请原谅 javascript,但我对 Dart 不熟悉,应该非常相似):

var products = await firestore.collectionGroup('products')
                       .where('tag', '==', 'coffee')
                       .where('pincode', '==', '234144').get();

正如您所指出的,使用此解决方案,您需要在每个产品中保留pincode这条数据是重复的,感觉应该避免它是正常的,因为它是浪费和危险的(可能不同步),但这是要走的路!它被称为非规范化Todd Kerpelman在这段视频中很好地解释了这一点。 然后,您可以创建由餐厅更新触发的云函数,以使产品中的密码餐厅中的相应密码保持同步

查询餐馆然后产品

要将密码仅保留餐厅中,您必须分两步进行查询:首先过滤特定密码中的餐厅,然后按标签过滤产品:

// 1 - retrieve restaurants in specific pincode
var restaurants = await firestore.collection('restaurants').where('pincode', '==', '234144').get();

// 2 - For each retrieved restaurant, retrieve all products matching the tag
var products = [];
for(let i = 0; i < restaurants.docs.length; ++i) {
  var p = await restaurants.docs[i].collection("products").where("tag", "==", "coffee");
  products.push(p);
}

使用这种方法,无需在每个产品中复制pincode,但是您的查询不太理想,因为您加载了可能无用的餐厅,这些餐厅在您的 pincode 中不提供咖啡。

于 2021-01-20T16:30:56.460 回答