如何检查Firestore文档中的数组是否为空?

时间:2020-03-21 03:03:00

标签: firebase flutter dart google-cloud-firestore

我正在快速开发一个应用程序,我想运行一个查询以确定Firestore文档中的数组是否为空。有没有办法做到这一点?

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

enter image description here

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

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

我离开了arrayContains:暂时是空的。请告知我如何实现此功能。提前致谢!

3 个答案:

答案 0 :(得分:6)

一个空数组默认为[],因此可以通过执行以下操作: 不要在方括号中使用''

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);

答案 1 :(得分:1)

无法通过Firestore查询检查数组是否为空。
但是,您可以按照以下步骤操作:

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

答案 2 :(得分:1)

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

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

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

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

通过这种方式可以实现您想要的目标-

firebase-tools

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