当前位置: 首页 > 知识库问答 >
问题:

Firebase查询是否包含一个值

梅飞宇
2023-03-14

表的结构是:

    null

以下是我目前掌握的信息:

 subscribeChats(username: string) {
    return this.af.database.list('chats', {
        query: {
            orderByChild: 'participants',
            equalTo: username, // How to check if participants contain username
        }
    });
 }

共有1个答案

广昊昊
2023-03-14

您当前的数据结构很适合查找特定聊天的参与者。然而,它不是一个很好的结构来查找反面:用户参与的聊天。

这里有几个问题:

  • 将集存储为数组
  • 只能在固定路径上索引

一个聊天可以有多个参与者,所以您将其建模为一个数组。但这实际上并不是理想的数据结构。很可能每个参与者只能在聊天中出现一次。但是通过使用数组,我可以:

participants: ["puf", "puf"]
participants: {
  "puf": true
}

这里的true实际上只是一个虚拟值:重要的是我们已经将名称移到了键中。现在,如果我再次尝试加入这个聊天,它将是一个noop:

participants: {
  "puf": true
}

当你加入的时候:

participants: {
  "john": true,
  "puf": true
}

这是您需求的最直接表示:一个只能包含每个参与者一次的集合。

ref.child("chats").orderByChild("participants/john").equalTo(true)
{
  "rules": {
    "chats": {
      "$chatid": {
        "participants": {
          ".indexOn": ["john", "puf"]
        }
      }
    }
  }
}

由于您希望显示用户的聊天室列表,因此存储每个用户的聊天室:

userChatrooms: {
  john: {
    chatRoom1: true,
    chatRoom2: true
  },
  puf: {
    chatRoom1: true,
    chatRoom3: true
  }
}

现在,您可以简单地通过以下命令确定聊天室列表:

ref.child("userChatrooms").child("john")

然后循环钥匙进入每个房间。

    null
chatroomUsers
  chatroom1
    user1: true
    user2: true
  chatroom2
    user1: true
    user3: true
userChatrooms
  user1:
    chatroom1: true
    chatroom2: true
  user2:
    chatroom1: true
  user2:
    chatroom2: true

在NoSQL解决方案中,拥有两个列表是完全正常的。在上面的示例中,我们引用userchatrooms作为chatroomsusers的倒排索引。

这是Cloud Firestore更好地支持此类查询的情况之一。它的array-contains运算符允许筛选数组中具有特定值的文档,而arrayremove允许将数组视为一个集合。有关这方面的更多信息,请参见Cloud FireStore中的更好阵列。

 类似资料:
  • 问题内容: 该表的结构为: chats –> randomId –>–> participants –>–>–> 0: ‘name1’ –>–>–> 1: ‘name2’ –>–> chatItems 等等 我想做的是查询聊天表,以通过传入的用户名字符串查找所有持有参与者的聊天。 这是我到目前为止的内容: 问题答案: 您当前的数据结构非常适合查找特定聊天的参与者。但是,这不是一个很好的反向搜索结构

  • 问题内容: 我有两个Hibernate数据对象。第一个是用户(具有唯一的ID,用户名等),第二个是Collaborateable类。在这两者之间存在n对m的关系(带有Set的实现)。这意味着,一个用户使用许多可协作对象,而一个可协作对象具有许多用户。另外,一个可协作对象只有一个用户作为所有者。 我想实现一个Hibernate查询,该查询搜索具有特定用户作为所有者或在Collaborateable.

  • 我的XSLT1.0模板中有两个变量,每个变量包含一个节点集(用xpath选择)。我想确定一个变量中的节点集是否包含在另一个变量中的节点集中。例如,假设我有一个包含嵌套部分的章节。我想看看是否包含在中: 我试图获取节点集的交集,以查看是否是和共享的第一个公共元素,但这不起作用: 添加一些上下文。我正在用这个xslt为html页面树创建一个选项卡式界面,我试图解决的问题是将class=“current

  • 我知道拆分字符串并使用运算符是可能的,但我想知道是否可以使用字符串比较轻松地完成。

  • 我试图在Flatter Firebase中执行一个“where”查询,以按名称进行过滤(如果对象名为“Una casa roja”,用户写“casa”,则必须返回该对象)。我不知道我能问谁。我只有这个,但不是我想要的: 谢谢