【问题标题】:How to check if an array in a firestore document is empty?如何检查firestore文档中的数组是否为空?
【发布时间】:2020-03-21 03:03:00
【问题描述】:

我正在用颤振构建一个应用程序,我想运行一个查询来确定我的 firestore 文档中的数组是否为空。有没有办法做到这一点?

这是我在 Firestore 中构建的数据的图片。

我知道有一个 arrayContains 方法,但我不确定如何检查 空数组。这是我当前的代码。

_postsStream = await _firestore
        .collectionGroup('posts')
        .where('timestamp', isGreaterThanOrEqualTo: _start)
        .where('timestamp', isLessThanOrEqualTo: _end)
        .where('problems', arrayContains: )
        .snapshots();

我暂时将 arrayContains: 留空。请告知我将如何实现此功能。提前致谢!

【问题讨论】:

标签: firebase flutter dart google-cloud-firestore


【解决方案1】:

一个空数组默认为 [] 所以这可以通过执行以下操作: 不要在方括号中使用“”

final _database = Firestore.instance;    

return _database
          .collection('arrays')
          .document(arrId)
          .where('array', isEqualTo: [])
           // .where('array', isNull: true) can be used to check if it's null
          .snapshots()
          .map(_itemListFromSnapshot);

【讨论】:

  • 这是最佳答案。不需要新的财产。我这样使用: ref.where('participants', '!=', [])
【解决方案2】:

您目前无法在 Firestore 中执行此操作。 你能做的就是。

  • 创建一个单独的属性 hasProblems,默认为 false。

  • 如果用户尝试注册问题,则检查标志 hasProblems。

    • 如果 hasProblems==false,则将其切换为 true 并将问题添加到列表中。
    • 否则无需切换,只需将新问题添加到列表中即可。
    • 如果以后要解决问题,请检查列表是否为空。 一旦它为空,然后将 hasProblems 切换回 false。

这样你就可以实现你想要的-

postsStream = await _firestore
        .collectionGroup('posts')
        .where('timestamp', isGreaterThanOrEqualTo: _start)
        .where('timestamp', isLessThanOrEqualTo: _end)
        .where('hasProblems',isEqualsTo: false)
        .snapshots();

也许您可以有其他更好的解决方案,但这是我想到的。 您可以按照@mubin986 给出的解决方案进行操作,但是一旦列表变得越来越大,就会影响性能。 干杯,希望对您有所帮助。

【讨论】:

  • 感谢您的解决方案!我一定会在我的代码中实现它并回复你。作为一个附带问题,我意识到即使我完全删除了用户的帖子集合并再次运行我的代码,期望用户的帖子消失,我仍然可以看到它们。为什么删除了该数据后流不会更新?
  • 我不确定。可能是 Firestore 正在缓存数据。
  • 也许吧。这有点令人沮丧,因为我明确删除了该数据,所以我希望这些数据会消失。有没有办法从缓存中删除该数据?你认为等一天左右会解决这个问题吗?
  • stackoverflow.com/q/48929728/7532298 检查这可能有帮助
  • 啊,太好了。太棒了。谢谢!还发现了这个:firebase.google.com/docs/firestore/manage-data/enable-offline -- 您可以将离线持久性的配置设置为 false。
【解决方案3】:

如果数组是否为空,则无法通过 firestore 查询进行检查。
但是,您可以按照以下步骤操作:

  • 使用范围过滤器查询数据:
_postsStream = await _firestore.collectionGroup('posts')
   .where('timestamp', isGreaterThanOrEqualTo: _start)
   .where('timestamp', isLessThanOrEqualTo: _end)
   .snapshots();
  • 获取数据后,遍历所有DocumentSnapshot 并检查problems 数组是否为空。

【讨论】:

  • 您能否进一步解释“使用范围过滤器查询数据”的含义。
  • 当您在查询中使用>, <, >=, <= 这些运算符时,它被称为range filters。这里你使用了isGreaterThanOrEqualTo: _startisLessThanOrEqualTo: _end,这就是我提到range filters的原因
猜你喜欢
  • 2022-11-02
  • 2021-07-22
  • 1970-01-01
  • 2019-01-09
  • 1970-01-01
  • 2021-06-18
  • 2021-11-25
  • 2019-01-09
  • 1970-01-01
相关资源
最近更新 更多