繁体   English   中英

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

[英]Firebase realtime database - orderByChild not returning any result

我正在使用Firebase实时数据库函数.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

sender快照数量0

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

为什么我的查询没有返回任何结果?

似乎我必须搜索dbRoot.child('messages / rKNUGgdKqdP68T0ne6wmgJzcCE82')以获取我的价值。 :/(然后重复搜索每个用户),下载/收集所有联系人,然后遍历每个用户的联系人,将有多少额外的数据开销?

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

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

请注意我在您的代码中所做的两项更改:

  1. 现在,我们从messages/mUO3DtYY2yRw3zkv4EmTlfldB3S2开始搜索,以便仅搜索该用户的消息。
  2. 现在,我们在messages/mUO3DtYY2yRw3zkv4EmTlfldB3S2下为每个孩子的sender/sid属性进行排序/过滤。

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


当前的数据结构无法在所有用户中查找特定sender/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,
  }
}

现在,您可以通过阅读以下内容找到特定sender/sid的消息:

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

然后遍历结果,并根据需要从每个路径加载各个消息。

这在NoSQL数据库中非常普遍:您通常必须修改数据结构,以允许将要添加到应用程序的用例。

也可以看看:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM