【问题标题】:Flutter firebase query, filter based on subcollection presenceFlutter firebase 查询,基于子集合存在的过滤器
【发布时间】:2021-02-26 10:08:17
【问题描述】:

我正在尝试在 Flutter 中构建一个 Firestore 查询,该查询根据请求的美食过滤餐厅结果。

根据Firestore query where map contains stringLucas Aschenbach 的回答,我设计了我的数据库,以便将美食列在一个公共子集合中

我的查询是:

final Query locations = FirebaseFirestore.instance
        .collection('locations')     
        .where('cuisines.$id.exists', isEqualTo: true);

我已添加对子集合的读取权限:

match /locations/{l} {
      allow read: if true;
      allow write: if request.auth.token.role == 'admin';
    }
match /locations/{l}/cuisines {
      allow read: if true;
      allow write: if request.auth.token.role == 'admin';
    }

我的测试用例中的 $id 是“american”

...但是...没有结果。

有没有人看到明显的错误?赞赏!

【问题讨论】:

  • 很遗憾,您的查询与您的数据完全不匹配。您可以将点表示法用于文档字段查询,但由于您的数据当前已被组织,因此它们不能用于访问子集合中的文档。如果要查询子集合中的文档,则需要构建该子集合的路径。
  • 我想要的只是'给我镇上所有的汉堡吧',而且我不受它的设置方式的限制。我有一个数组中的美食,但它给了我一个类型错误,所以我正在尝试这种方法。你有什么建议?
  • 您将不得不重组数据以支持您打算执行的查询。使用 nosql 类型的数据库,只有在您知道查询后才能真正进行建模 - 查询将决定数据的建模方式。
  • 是的,我很高兴改造数据库。使用 SQL 的一两年让我养成了需要改掉的严重习惯!
  • 不得不请假一周。谢谢楼下的详细回复。我现在将进行测试,可能会给你很棒的赞许、复选标记和普遍的喜悦。

标签: firebase flutter google-cloud-firestore


【解决方案1】:

Cloud Firestore 上的查询对单个集合或同名的一组集合进行操作。无法在查询中从另一个集合中获取条件(或以其他方式读取)数据。

这意味着您的.where('cuisines.$id.exists', isEqualTo: true) 只能在餐厅文档中出现cuisines.$id.exists 的情况下工作。实现您的用例的最常见方法是在餐厅文档中添加一个数组字段servedCuisines,其内容是餐厅供应的美食。

`servedCuisines: ["american"]`

然后在查询中使用arrayContains 操作:

final Query locations = FirebaseFirestore.instance
        .collection('locations')     
        .where("cuisinesServed", arrayContains: id);

【讨论】:

  • 完美,谢谢!我确定我上周尝试了这样一个基本的事情,但没有结果。我可能遇到了类型转换问题 - 无论哪种方式,感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2018-03-22
  • 2020-10-10
  • 2020-10-22
  • 1970-01-01
  • 2020-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多