【问题标题】:How to filter sub collection in firebase (flutter)?如何过滤firebase中的子集合(颤振)?
【发布时间】:2021-10-18 11:28:23
【问题描述】:

我有一个名为Channels 的集合,在其中我有一个名为messages 的子集合,所以我想过滤频道集合然后我想从中获取消息?

FirebaseFirestore.instance
        .collection('Channels') >> where(id = user.uid) <<<<< I want to filter this 
        .doc()
        .collection("messages")
        .orderBy("createdAt")
        .snapshots(),

*任何帮助将不胜感激^^

错误:

没有为类型“查询”定义方法“文档”。 尝试将名称更正为现有方法的名称,或定义名为“doc”的方法。

【问题讨论】:

    标签: firebase flutter google-cloud-firestore


    【解决方案1】:

    根据this link,您应该使用where 方法。将其与firebase.flutter.dev docs(标题与相关示例here)相结合,您应该能够使用以下方式完成此操作:

    FirebaseFirestore.instance
      .collection('Channels')
      .where('id', isEqualTo: user.uid)
    

    channelID 是否与 senderID 相同?如果答案是肯定的,您是否需要两者(并且您确定这是您想要的结构)? :)

    【讨论】:

    • 是的,但我仍然不能像这样放置 where 条件:FirebaseFirestore.instance .collection('Channels').where('') .doc() >>> 错误:方法'doc'没有为“查询”类型定义。尝试将名称更正为现有方法的名称,或定义名为“doc”的方法。 .collection("messages") .orderBy("createdAt") .snapshots(),
    • FirebaseFirestore.instance.collection('Channels').where('id', isEqualTo: user.uid).doc().collection("messages") 是否返回任何错误?
    • 我已经更新了帖子你可以明白我的意思^^
    【解决方案2】:

    Firestore 查询只能访问单个集合或一组同名集合中的文档。因此,您无法根据父 Channels 文档中的字段过滤来自 messages 的文档。

    可以做的是将相关字段添加到每个 messages 文档,例如在名为 channelUID 的字段中。然后您可以使用collection group query 查询所有messages 集合:

    FirebaseFirestore.instance
            .collectionGroup("messages")
            .orderBy("createdAt")
            .where("channelUID", isEqualTo: user.uid)
            .snapshots(),
    

    【讨论】:

    • 问题是用户可以制作多个频道,每个频道都有一个唯一的receiverid。如果我使用您的函数来查询所有消息,它将从所有渠道获取所有消息这里是我用来发送消息的函数 `void onSend(ChatMessage message) { FirebaseFirestore.instance .collection('Channels') .doc( ) .collection("messages") .doc(DateTime.now().millisecondsSinceEpoch.toString()) .set(message.toJson()); setState(() { messages = [...messages, message]; print(messages.length); });`
    • UID 上的.where("channelUID", isEqualTo: user.uid) 过滤器与您问题中的查询相同。唯一的区别是您现在需要将该字段添加到 messages 子集合中的每个文档中以允许该用例。如果您仍然得到太多结果文档,则必须向messages 文档添加更多字段以允许过滤它们,因为 Firestore 只能从查询中的单个集合或一组集合中访问文档同名。
    • OP 的数据结构已经到位。所以改变数据库结构并不是我们所要求的。你的答案没有错,如果问题是关于如何重组
    【解决方案3】:

    问题是doc()是空的,所以FB不知道该进入哪个doc。

    只需在doc() 中添加频道的id,如下所示:

    FirebaseFirestore.instance
      .collection('Channels')
      .doc(recieverID)
      .collection('messages')
      .orderBy('createdAt')
    

    【讨论】:

    • 正如我之前提到的,我有一个频道集合,每个频道都有一个唯一的接收者ID,所以我想要的是从这个特定频道获取消息,而不是从其他频道中获取所有消息跨度>
    • 知道了。现在更新答案
    猜你喜欢
    • 2021-12-10
    • 1970-01-01
    • 2020-11-24
    • 1970-01-01
    • 2020-12-25
    • 2021-11-25
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    相关资源
    最近更新 更多