如何从Cloud Firestore请求中删除单个文档?

时间:2018-09-10 15:09:09

标签: flutter google-cloud-firestore

我有一个收集用户,我在其中存储所有用户数据。
现在,我的问题是如何只获取那些电子邮件与当前用户的电子邮件不相等的文档。

Firestore.instance.collection(USERS_COLLECTION).where("email",isLessThan: _useremail).snapshots(),
              builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot,) {
                if (!snapshot.hasData)
                  return new Container(child: Text(""),);
                var documentsLength = snapshot.data.documents.length;
                int rand = new Math.Random().nextInt(documentsLength.toInt());

1 个答案:

答案 0 :(得分:1)

有关一般性回答,请refer to this explanation Doug Stevenson gave
简而言之,由于 Firestore的索引的工作方式,不支持不等式操作。

针对您的特定问题,有一种简单的解决方法:
您可以轻松地删除不需要客户端单个文档,这几乎不会改变数据和处理能力。

因为我想您仍然想使用StreamBuilder,所以我将展示一种从您从List<DocumentSnapshot>得到的snapshot.data.docments中删除带有用户电子邮件的文档的方法:

StreamBuilder(
    stream: Firestore.instance
        .collection(USERS_COLLECTION)
        .snapshots(),
    builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
      if (!snapshot.hasData)
        return Container(child: Text(""));
      final List<DocumentSnapshot> documents = snapshot.data.documents.where((snapshot) => snapshot.data["email"] != _useremail);
      var documentsLength = documents.length;
      // ...
    });

调整之处在于删除了查询中的where并添加了以下代码行:

final List<DocumentSnapshot> documents = 
  snapshot.data.documents.where((snapshot) => snapshot.data["email"] != _useremail);

这将删除所有等于 _useremail的文档,这等同于您的请求。
请注意,此后您将需要使用documents,就像我使用documentsLength一样。

如果要删除多个文档,这也将起作用,但是显然,如果检索到的文档“不必要”,则价格会更高。因此,如果您认为自己进行了太多不必要的文档读取操作,则应考虑调整数据库结构。

另外,as mentioned here,您不需要在Dart 2中使用new关键字。