如果我理解正确,您想检索具有特定标签和密码的所有产品(我想这类似于邮政邮政编码?)。我真的只有两种选择:
集合组查询
正如您所提到的,您可以在产品文档中存储标签和密码。然后按照这些行执行单个集合组查询(请原谅 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 中不提供咖啡。