【问题标题】:Flutter Firebase whereIN 10 limit ProblemFlutter Firebase whereIN 10 限制问题
【发布时间】:2022-01-16 23:35:16
【问题描述】:

我有这样的 id 列表;

List<dynamic> saveIDList = [];这个列表中的值会根据用户保存的id而变化。

我尝试显示用户保存的帖子。所以我创建了一个这样的查询;

 Query saveIDRef = _firestore
              .collectionGroup("Posts")
              .where("postID", whereIn: saveIDList);

创建此查询后,我在流构建器中调用 saveIDRef。到目前为止,我的代码没有任何问题,可以正常工作,但是当 saveIDlist 的长度超过 10 时,我会收到警告。

我无法更改我的数据库表单或查询我的 saveIDList 的方式,我该如何解决这个问题?

我尝试了不同的解决方案,但没有奏效。

例如,我创建这样的块列表;

var chunks = [];

for (var i = 0; i < saveIDList.length; i += 10) {
      chunks.add(saveIDList.sublist(
          i, i + 10 > saveIDList.length ? saveIDList.length : i + 10));
    }

我在 saveIDList 中分离了值,然后我在 whereIN 查询中使用了这样的块;

 Query saveIDRef = _firestore
                  .collectionGroup("Posts")
                  .where("postID", whereIn: chunks);

但这也没有用。当我像这样查询块列表时;

Query saveIDRef = _firestore
                      .collectionGroup("Posts")
                      .where("postID", whereIn: chunks[0]);

它有效。但我想查询块列表中的所有元素,而不是块列表的唯一第一个元素。当我将此代码放入 for 循环时,出现 whereIN 查询不能多次使用的错误。

【问题讨论】:

标签: firebase flutter google-cloud-firestore


【解决方案1】:

正如Firebase documentation 中关于 Cloud Firestore 中的简单查询和复合查询所述,逻辑查询存在一些限制:

Cloud Firestore 为逻辑 OR 查询提供有限支持。 inarray-contains-any 运算符支持单个字段上最多 10 个相等 (==) 或 array-contains 条件的逻辑 OR。对于其他情况,请为每个 OR 条件创建单独的查询,并在您的应用中合并查询结果。

因此,一种可能的解决方案是创建列表的块并按照您的尝试分别查询这些块。例如,您可以使用 List 对象的 List subList 方法来创建这些子列表或块。

【讨论】:

    猜你喜欢
    • 2018-09-27
    • 2020-03-30
    • 2019-06-04
    • 1970-01-01
    • 2021-12-05
    • 2017-06-26
    • 1970-01-01
    • 2021-04-27
    • 2022-01-22
    相关资源
    最近更新 更多