首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >子集合的Firestore侦听器

子集合的Firestore侦听器
EN

Stack Overflow用户
提问于 2018-11-09 22:14:27
回答 5查看 6.1K关注 0票数 7

我通过以下方式设置Firestore:

通道采集-> channelID ->消息采集-> messageID

如何将snapshotListener添加到子集合'Messages‘?

代码语言:javascript
复制
  Firestore.firestore().collection("Channels").document().collection("Messages").addSnapshotListener { (querySnapshot, error) in
        guard let snapshot = querySnapshot else {
            print("Error listening for channel updates: \(error?.localizedDescription ?? "No error")")
            return
        }

        snapshot.documentChanges.forEach { change in 
           print(change)
        }
    }

这对我不起作用

EN

回答 5

Stack Overflow用户

发布于 2018-11-09 22:48:54

您不能让单个侦听器接收来自未知数量的子集的更新。集合上的侦听器没有“通配符”运算符。您必须选择一个特定的集合或查询,并将侦听器附加到该集合或查询。

票数 4
EN

Stack Overflow用户

发布于 2018-11-11 23:39:41

正如Doug在他的正确答案中指出的那样,您不能让单个侦听器接收来自未知(数量或未指定的)子集合的更新。

但是,如果您可以确定这些子集合的名称,那么答案就非常简单了。

其思想是读取Channels的子节点,即channel_0、channel_1等,并使用这些文档id构建对您感兴趣的侦听节点的引用。

因此,给定此结构(与问题中的结构相匹配):

代码语言:javascript
复制
Channels
  channel_0
    Messages
      message_0
        msg: "chan 0 msg 0"
      message_1
        msg: "chan 0 msg 1"
      message_2
        msg: "chan 0 msg 2"
  channel_1
    Messages
      message_0
        msg: "chan 1 msg 0"
      message_1
        msg: "chan 1 msg 1"

下面的代码向每个通道添加侦听器,并响应该通道中的事件消息,在控制台中通知消息id、msg文本和发生事件的通道。

代码语言:javascript
复制
func addChannelCollectionObserver() {
    let channelsRef = self.db.collection("Channels")
    channelsRef.getDocuments(completion: { snapshot, error in

        guard let documents = snapshot?.documents else {
            print("Collection was empty")
            return
        }

        for doc in documents {
            let docID = doc.documentID
            let eachChannelRef = channelsRef.document(docID)
            let messagesRef = eachChannelRef.collection("Messages")

            messagesRef.addSnapshotListener { querySnapshot, error in

                querySnapshot?.documentChanges.forEach { diff in
                    if diff.type == .added {
                        let doc = diff.document
                        let msgId = doc.documentID
                        let channelId = messagesRef.parent!.documentID
                        let msg = doc.get("msg") as? String ?? "no message"
                        print(" added msgId: \(msgId) with msg: \(msg) in channel: \(channelId)")
                    }

                    if diff.type == .modified {
                        let doc = diff.document
                        let msgId = doc.documentID
                        let msg = doc.get("msg") as? String ?? "no message"
                        print(" modified msgId: \(msgId) with msg: \(msg)")
                    }

                    if diff.type == .removed {
                        let doc = diff.document
                        let msgId = doc.documentID
                        let msg = doc.get("msg") as? String ?? "no message"
                        print(" removed msgId: \(msgId) with msg: \(msg)")
                    }
                }
            }
        }
    })
}

第一次运行时,如预期的那样,输出将显示每个子节点。从那时起,它将输出任何添加、修改或删除的内容。

代码语言:javascript
复制
 added msgId: message_0 with msg: chan 0 msg 0 in channel: channel_0
 added msgId: message_1 with msg: chan 0 msg 1 in channel: channel_0
 added msgId: message_2 with msg: chan 0 msg 2 in channel: channel_0
 added msgId: message_0 with msg: chan 1 msg 0 in channel: channel_1
 added msgId: message_1 with msg: chan 1 msg 1 in channel: channel_1

代码还需要对一些可选选项进行一些额外的错误检查,但它应该提供一个解决方案。

票数 3
EN

Stack Overflow用户

发布于 2020-02-13 20:15:04

通过侦听具有相同名称的所有集合来使用collection group query

代码语言:javascript
复制
    db.collectionGroup("Messages"). docRef.addSnapshotListener(new EventListener<DocumentSnapshot>() {
  @Override
  public void onEvent(@Nullable DocumentSnapshot snapshot,
                      @Nullable FirestoreException e) {
    if (snapshot != null && snapshot.exists()) {
      System.out.println("Current data: " + snapshot.getData());
    } else {
      System.out.print("Current data: null");
    }
  }
});
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53227376

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档