【问题标题】:how do I check collection exists or not in firestore on flutter?如何在颤动的 Firestore 中检查集合是否存在?
【发布时间】:2019-12-06 00:53:47
【问题描述】:

我从 Firestore 获得了一些数据。有时当我调用获取数据时,该集合尚未创建。 在调用 get 请求之前,如何检查集合是否存在?

  Stream<List<ChatModel>> getChat(ChatFieldModel model) {
    var ref = _db.collection('chats');

      return ref
          .document(model.docId)
          .collection('messages')
          .orderBy('timestamp', descending: true)
          .snapshots()
          .map((list) =>
          list.documents.map((doc)=>ChatModel.fromForestore(doc)).toList());
  }

【问题讨论】:

  • 您只能通过从集合中读取文档来确定集合是否存在。最便宜的方法是阅读单个文档。您刚刚在这里评论了我对几乎完全相同的问题的回答:stackoverflow.com/questions/54055565/… 这个问题与那个问题有何不同?

标签: firebase flutter dart google-cloud-firestore


【解决方案1】:

我之前发过这个

 final snapshot = await firestore.collection(roomName).getDocuments();
 if (snapshot.documents.length == 0) {
 //doesnt exist
 }

希望对你有帮助

【讨论】:

  • 请始终在此类操作中添加limit(1),否则您最终可能会阅读过多的文档。
【解决方案2】:

集合不会独立于文档创建或删除。当您创建文档并将其指定为某个集合的一部分时,如果该集合尚不存在,则会自动创建该集合。同样,当您删除集合中的最后一个文档时,该集合将被自动删除。因此,您实际上无需担心是否已创建集合,并且您无法明确控制创建或删除集合。

【讨论】:

    【解决方案3】:

    如果 Firestore 中的集合不存在任何文档,通常会被删除。

    但是,在某些情况下,您可能希望保留集合修改事件的历史记录,或者假设出于某种原因阻止集合被删除。

    或者,例如,您想知道最初创建集合的时间。通常,如果 Documents 被删除,然后 Collection 被重新创建,您将不知道初始创建日期。

    我能想到的解决方法如下:

    使用专门用于保存有关该集合的通用信息的文档来初始化您想要的每个集合。

    例如

    这样,即使集合中的所有其他文档都被删除,您仍然会保留该集合以及一些可能会派上用场的信息,如果将来您需要获取有关该集合的一些历史信息。

    所以要知道集合是否存在,您可以运行查询来检查信息文档中的字段(例如 CollectionInfo.exists),以了解已创建的集合。

    【讨论】:

    • 但是,请记住,每次额外的读/写操作都会产生额外的费用。
    【解决方案4】:

    2022 年 2 月

    获取 QuerySnapshot 并返回 querySnapshot.docs.isNotEmpty 或 isEmpty

     Future<bool> isItems() async {
        CollectionReference collectionReference =
            _firestore.collection("users").doc(_user!.uid).collection("cart");
        QuerySnapshot querySnapshot = await collectionReference.get();
        return querySnapshot.docs.isNotEmpty;
      }
    

    【讨论】:

    • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
    【解决方案5】:

    这是最新的更新

     final snapshot = await FirebaseFirestore.instance
       .collection('collection name').get();
    
     if ( snapshot.size == 0 ) {
       print('it does not exist');
     }
    

    【讨论】:

    • 我将为您修正格式。请在下次发布之前完成此操作。
    【解决方案6】:
    await FirebaseFirestore.instance
        .collection('collectionName')
        .limit(1) 
        .get() 
        .then((snapshot) { 
            if (snapshot.size == 0) {
                print("No collection"); 
            } 
        });
    

    【讨论】:

    • 虽然此代码 sn-p 可能会解决问题,但including an explanation 将帮助人们了解您的代码建议的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-21
    • 2019-04-19
    • 2021-12-22
    • 2018-06-11
    • 2021-09-15
    • 2023-01-05
    • 2020-11-17
    相关资源
    最近更新 更多