【问题标题】:Firestore whereNotIn QueryFirestore whereNotIn 查询
【发布时间】:2021-07-09 13:03:34
【问题描述】:

使用颤振和 Firestore。我有一组小部件。我查询这些小部件并一次将它们显示给用户,这样他们就可以告诉我他们以前是否在现实生活中见过这个小部件。查询:

firestore.collection('widgets').where('docID', whereNotIn: seenBeforeList).get()

其中 'seenBeforeList' 是用户文档中的一个数组,用于跟踪他们标记为已见的小部件。

假设我有 20 个小部件。用户已将前 11 个小部件标记为已查看并关闭应用程序。下一次启动查询说,给我用户还没有看到的所有小部件(最后 9 个)。本质上,我不想显示用户已经标记为已看到的小部件。然而,firestore 有 'value.length

我似乎想不出不同的解决方案。也许是不同的数据结构......我不确定。我错过了什么吗?任何想法将不胜感激!提前致谢!

【问题讨论】:

    标签: firebase flutter google-cloud-firestore


    【解决方案1】:

    这听起来很蹩脚,但我认为通常建议的解决方案是循环 10/n 次,然后将 get 聚合到一个列表中,然后等待。这也是我个人会采用的解决方案

    // Note, haven't tested this code at all
    Future<List<QuerySnapshot<T>>> getNotInList(
      List<String> seenBeforeList,
    ) async {
      final snapshotsFutures = <Future<QuerySnapshot<T>>>[];
    
      for (var i = 0, limit = 10; i < seenBeforeList.length; i++) {
        final ids = seenBeforeList
            .getRange(i * limit, max((i + 1) * limit, seenBeforeList.length))
            .toList();
        // final seenBeforeList = ids.slice(i, i * limit); ?
        snapshotsFutures.add(
          firestore
              .collection('widgets')
              .where('docID', whereNotIn: ids)
              .get(),
        );
      }
    
      return await Future.wait(snapshotsFutures);
    }
    

    对于在 react native 的上下文中提出的类似问题,有这个SO answer as well。 noSQL 肯定有一些奇怪的限制,但你能做什么:\

    编辑

    这将不起作用,因为某些期货会产生您不需要的结果,因为它们的排除 id 与其他期货不同

    【讨论】:

    • 谢谢。我想我明白你在做什么。假设我有 25 个小部件文档,而用户已经看过 1-15 个。第一个循环将返回 11-25,第二个循环将返回 1-10 和 15-25。正确的?我是否理解正确,这是您所期望的吗?您可以解析结果,但我觉得有很多不必要的读取。也许就是这样,还是我误解了什么? E:绝对理解仅仅尝试头脑风暴是有局限性的?‍♂️。感谢您的反馈!
    • 是的,再看一遍,我只是注意到这个解决方案可能不起作用。我想我在考虑aggregating 解决方案,但whereNotIn 暗示不是结果的交集,而是其他东西。抱歉,我能想到的唯一其他解决方案(除了cloud_function)是获取整个集合,然后对整个事情进行 ids 删除。我会再考虑一下,看看我是否还能想到其他事情
    • 是的,这更有意义。不用担心,我感谢您的努力!是的,整个系列也很有效。可能是要走的路,只是想我会尽量避免从可能的集合大小中读取潜在的大量数据。我一直在考虑甚至可能是某种不同的数据结构。可能为所有具有“已看到”字段的小部件的用户文档维护一个子集合。问题是如果我有 10,000 个用户并且我添加了一个新的小部件,我必须进行 10,000 次写入。也许这不是一个大问题?我认为这与可扩展性相反,哈哈。
    猜你喜欢
    • 1970-01-01
    • 2016-10-26
    • 2020-05-02
    • 2021-06-27
    • 1970-01-01
    • 1970-01-01
    • 2016-10-28
    • 2016-03-14
    • 2021-01-26
    相关资源
    最近更新 更多