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

Firebase实时数据库- orderByChild不返回任何结果

燕昊东
2023-03-14

我正在使用火库实时数据库函数 .orderByChild() 和 .equalTo() 来获取要更新的数据节点。但是,我似乎无法从查询中获得任何结果。

我的数据库结构

{
  "4QEg0TWDbESiMX8Cu8cvUCm17so2" : {
    "-LmGtXsgJbAvVS8gv5-E" : {
      "createdAt" : 1565815876803,
      "message" : "Hello",
      "isSender" : false,
      "sender" : {
        "alias" : "",
        "name" : "Person A",
        "sid" : "mUO3DtYY2yRw3zkv4EmTlfldB3S2"
      },
      "sysStatus" : 0
    },
    "-LmGtt4nyuygG9B4s6__" : {
      "createdAt" : 1565815967746,
      "message" : "Hej!",
      "isSender" : true,
      "sender" : {
        "alias" : "",
        "name" : "Person B",
        "sid" : "4QEg0TWDbESiMX8Cu8cvUCm17so2"
      },
      "sysStatus" : 0
    },
    "-LmJxcvL_Y7JmojxPiiK" : {
      "createdAt" : 1565867281849,
      "isSender" : true,
      "message" : "111",
      "sender" : {
        "alias" : "",
        "name" : "Person B",
        "sid" : "4QEg0TWDbESiMX8Cu8cvUCm17so2"
      },
      "sysStatus" : 0
    }
  },
  "mUO3DtYY2yRw3zkv4EmTlfldB3S2" : {
    "222" : {
      "createdAt" : 1565867281849,
      "isSender" : true,
      "message" : "Test",
      "sender" : {
        "alias" : "",
        "name" : "Person A",
        "sid" : "mUO3DtYY2yRw3zkv4EmTlfldB3S2"
      },
      "sysStatus" : 0
    },
    "333" : { <-- This is one node I wish to fetch
      "createdAt" : 1565815967746,
      "isSender" : false,
      "message" : "123",
      "sender" : {
        "alias" : "",
        "name" : "Person B",
        "sid" : "4QEg0TWDbESiMX8Cu8cvUCm17so2" <-- This is the value I am trying to match
      },
      "sysStatus" : 0
    }
  },
  "rKNUGgdKqdP68T0ne6wmgJzcCE82" : {
    "-Lm_GTmNHyxqCqQl4D4Z" : { <-- This is one node I wish to fetch
      "createdAt" : 1566140917160,
      "isSender" : false,
      "message" : "Sesame",
      "sender" : {
        "alias" : "",
        "name" : "Person B",
        "sid" : "4QEg0TWDbESiMX8Cu8cvUCm17so2" <-- This is the value I am trying to match
      },
      "sysStatus" : 5
    }
  }
}
  

我的代码

dbRoot.child('messages')
.orderByChild('sid')
.equalTo(userId)
.once('value', (senderSnapshot) => {
  console.log('senderSnapshot', senderSnapshot.val())
  console.log('senderSnapshot amount', senderSnapshot.numChildren())
  senderSnapshot.forEach((sender)=>{
    //Do the work!
  })
})

代码日志

senderSnapshot null

senderSnapshot金额0

我已经手动检查了有几个节点,其中“sid”设置为我正在寻找的“userId”。

为什么我的查询没有得到任何结果?

看起来我必须搜索dbRoot。child('messages/rknuggdkqdp68t0ne6wmgjzccec82')以获取我的值。:/(然后对每个用户重复搜索)下载/收集所有联系人,然后循环访问每个用户联系人,需要多少额外的数据开销?

共有1个答案

丁阳炎
2023-03-14

Firebase 数据库查询允许您在位于特定位置的直接子节点中搜索每个子节点下固定路径处的值。因此:如果您知道要搜索其邮件的用户,则可以执行以下操作:

dbRoot
  .child('messages')
  .child('mUO3DtYY2yRw3zkv4EmTlfldB3S2') // the user ID
  .orderByChild('sender/sid')
  .equalTo(userId)

请注意我在这里对代码所做的两个更改:

    < li >我们现在从< code > messages/muo 3 DTY y2 yrw3zkv 4 emtlfldb 3s 2 开始搜索,因此它只搜索该用户的邮件。 < li >现在,我们对< code > messages/muo 3 DTY 2 yrw3zkv 4 emtlfldb3s 2 下的每个孩子的< code>sender/sid属性进行排序/筛选。

通过组合这些,我们实际上是在搜索子节点的平面列表,在每个子节点下的路径中寻找特定的匹配值。

在当前数据结构中,无法查找所有用户中特定发件人/sid 值的所有邮件。要允许这样做,您必须添加一个额外的数据结构,其中您基本上颠倒了当前数据。

"sender_messages": {
  "mUO3DtYY2yRw3zkv4EmTlfldB3S2": {
    "4QEg0TWDbESiMX8Cu8cvUCm17so2/-LmGtXsgJbAvVS8gv5-E": true,
  },
  "4QEg0TWDbESiMX8Cu8cvUCm17so2": {
    "4QEg0TWDbESiMX8Cu8cvUCm17so2/-LmGtXsgJbAvVS8gv5-E": true,
    "4QEg0TWDbESiMX8Cu8cvUCm17so2/-LmGtt4nyuygG9B4s6__": true,
    "4QEg0TWDbESiMX8Cu8cvUCm17so2/-LmJxcvL_Y7JmojxPiiK": true,
    "mUO3DtYY2yRw3zkv4EmTlfldB3S2/333": true,
    "rKNUGgdKqdP68T0ne6wmgJzcCE82/Lm_GTmNHyxqCqQl4D4Z": true
  },
  "mUO3DtYY2yRw3zkv4EmTlfldB3S2": {
    "mUO3DtYY2yRw3zkv4EmTlfldB3S2/222": true,
  }
}

现在,您可以通过阅读以下内容来查找特定发件人/ sid的消息:

dbRoot
  .child('sender_messages')
  .child('4QEg0TWDbESiMX8Cu8cvUCm17so2') // the sender ID

然后对结果进行循环,并根据需要从每个路径加载各个消息。

这在非关系型数据库中很常见:您通常必须修改数据结构以允许您要添加到应用程序中的用例。

另见:

    < li>Firebase查询子级的子级是否包含值 < li>Firebase查询双重嵌套 < li >通过使用query而不是重复观察单个事件来加快为我的社交网络应用程序获取帖子的速度(了解为什么加载附加消息远没有您最初想象的那么慢)
 类似资料:
  • 我有如下结构的Firebase实时数据库数据,我想在“联系人”和“备注”节点中用“-ultimateId123”替换“-preliminaryId”。要执行此操作,我将删除旧节点并用新节点替换它们。 电子邮件的新id“hello@bye.com“应为”-ultimateId123”。(我无法将电子邮件作为密钥存储在Firebase实时数据库中。) 我首先获取要替换的初步id。 变量将是 然而,我更

  • 我正在尝试在Firebase中进行简单搜索以从我的Firebase数据中返回数据,但没有任何返回。 JSON结构 我的Firebase搜索代码如下 但一旦代码被执行,它就会返回null。还有一种方法可以搜索特定字段。

  • 我在一个Android应用程序中使用Firebase数据库,每次用户启动时,我都会在数据库中存储一些值,为此我会执行以下操作: 正如您在子方法中看到的,如果称为“usrId”,它将创建usrId目录,并在其中添加所有neccesary信息。但是我想为每个用户创建目录,所以我尝试传递usrId变量作为参数。但它不起作用。当我调试代码时,调试器说本地var usrId无法识别,我的问题是如何在Fire

  • 我正在一个聊天应用程序,其中消息存储在firebase实时数据库。现在,如果我创建一个如下所示的节点(Chats-Better-A-ID和-B-ID是自动生成的聊天室密钥),那么我想知道当用户S在聊天应用程序中打开与用户T聊天时,so数据库将只读取存储在Chats-Better-S-T-ID中的消息,而不会读取其他聊天室消息!?我说的对吗?如果是,那么它会降低定价吗? 或 如果我存储如下所示的数据