【问题标题】:How can I retrieve the full path to a child node using orderByChild equalTo?如何使用 orderByChild equalTo 检索子节点的完整路径?
【发布时间】:2020-01-22 13:12:12
【问题描述】:

是否可以使用 orderByChild .equalTo 从 firebase 查询中检索到子节点的完整路径?我有 .indexOn: "city"

我的数据结构如下:

我试过了:

firebase.database().ref('users').orderByChild('city').equalTo('calgary').once("value", function(snapshot) {
  console.log(snapshot.ref.toString());
});

我也试过了:

console.log(snapshot.ref.toString());
//outputs: https://xxxx.firebaseio.com/users <-- WRONG, not full path.

console.log(snapshot.ref.path.toString());
//outputs /users <-- WRONG, not full path.

如何获得完整路径 - 从找到的密钥开始? 预期:/users/uid/location/

【问题讨论】:

  • 我不觉得这应该被标记为重复,因为我试图从 orderByChild() 中获取它,而不仅仅是一个简单的参考。
  • 仅适用于将来获得此“答案”的任何人-以下弗兰克的解决方案无法解决此问题,但我发现他对他回答的另一个问题的回答 ---“Firebase API仅允许您使用其 orderByChild 和 equalTo 方法过滤一级深度(或具有已知路径)的子级。"

标签: javascript firebase firebase-realtime-database


【解决方案1】:

要获取数据的完整限定 URL,您可以调用 DatabaseReference.toString()

要获取相同数据的路径,您可以从完整路径中减去根路径:

snapshot.ref.toString().substring(snapshot.ref.root.toString().length - 1)

另请参阅:how to get firebase.database.Reference full path,我会将您的问题标记为重复关闭。


由于您对 Firebase 数据库执行查询,因此可能会有多个结果。所以快照包含这些结果的列表。即使只有一个结果,快照也会包含一个结果列表。

您需要遍历这些结果,然后然后可以获得每个单独节点的路径:

firebase.database.ref('users').orderByChild('city').equalTo('calgary').once("value", function(snapshot) {
  var rootPath = snapshot.ref.root.toString();
  snapshot.forEach(function(child) {
    console.log(child.ref.toString().substring(rootPath.length - 1));
  })
});

原来你的搜索是错误的。由于您尝试在location/city 上订购/过滤,因此您也应该在orderByChild() 中使用:

firebase.database().ref('users').orderByChild('location/city').equalTo('calgary')

【讨论】:

  • 您可以在任何DatabaseReference 上调用toString(),例如您的代码中的snapshot.ref。我添加了一个如何在查询结果上执行此操作的示例。
  • 嘿弗兰克,感谢您的帮助,但它仍然对我不起作用。执行时,forEach 不会触发。 (我添加了更多的 console.log(s) 来检查它是否进入了 forEach)。
  • 是否存在可以通过这种方式嵌套和搜索数据的“最大”深度?如果我删除位置,它会起作用,而是直接在 UID 下嵌套 city:calgary。但不适用于 UID/location/city:calgary
  • 啊,我明白你的意思了。添加了有关如何按嵌套属性进行过滤的部分。如果您的问题没有集中在查找节点的路径上,它可能会更早发现这一点。
  • 现在明白了,感谢您的帮助! :) 我来自 SQL,所以学习这些东西比平时要花一点时间,哈哈。再次感谢。
猜你喜欢
  • 1970-01-01
  • 2015-10-17
  • 2017-08-22
  • 1970-01-01
  • 2021-05-23
  • 1970-01-01
  • 1970-01-01
  • 2019-07-26
  • 2018-03-12
相关资源
最近更新 更多