【问题标题】:Firebase equalto dynamic nested childFirebase 等于动态嵌套子级
【发布时间】:2016-04-20 10:14:27
【问题描述】:

结构为

/archive: {
  $userId: {
    $archiveKey: {
      foo: 1
    },
    ...
  },
  ...
}

其中$userId 引用user id$archiveKey 是动态的,由.push() 创建。

是否可以查询 archive 引用并获取所有 archiveObjects where foo = 1 ?还是我需要获取整个表,手动挖掘$userId 并提取我正在寻找的archiveObjects

【问题讨论】:

  • Firebase 中没有标准的查询系统,您需要对数据进行结构化以便能够执行应用程序所需的读取。所以是的,您需要手动挖掘或找到适合您需求的数据结构
  • AFAIK,这只是部分正确。你已经深深地嵌套在像orderByChild('child1/child2') 这样的静态子节点上。我的问题是这是否也适用于动态儿童。

标签: firebase firebase-realtime-database firebase-security


【解决方案1】:

Firebase 查询现在可以查询嵌套路径,但路径不能是动态的。

因此,如果您知道 uid,则可以使用以下命令查询该用户的档案:

ref.child(authData.uid).orderByChild('foo').equalTo(1).on(...

如果您不知道 uid,则必须创建一个允许您进行查找的数据结构:

archive_category_to_uids: {
  foo: {
    1: {
      uid1: true,
      uid2: true
    }
  }
}

一种更常见的方法是将档案分开到他们自己的顶级列表中,并让用户和类别都引用它:

users: {
  userId1: {
    archiveKey1: true,
    ...
  },
  ...
},
archives: {
  archiveKey1: {
    foo: 1,
    uid: uid1
  },
  ...
},
archiveCategories: {
  foo: {
    1: {
      archiveKey1: true,
      archiveKey2: true
    }
  }
}

现在您可以通过以下方式找到档案:

ref.child('archiveCategories/foo/1').once('value', function(keys) {
  keys.forEach(function(key) {
    ref.child('archives').child(key.key()).once('value', function(snapshot) {
      console.log(snapshot.val());
    });
  };
});

这个过程称为非规范化,在 NoSQL 数据库中很常见。您正在对数据进行建模,以了解应用程序需要如何使用它。有关此模式和其他常见模式的更多信息,我建议阅读此article on NoSQL data modeling

【讨论】:

  • 这很有趣,但是在您的最后一个查询中,您实际上是在进行number of archives 查询次数,但我想我需要花时间考虑这是否值得花时间来降低整个树的效率并手动解析。非常感谢。
  • 最后一个 sn-p 中的 once() 不是查询。这是一个直接查找,非常快。见stackoverflow.com/questions/35931526/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-12
  • 2019-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-22
相关资源
最近更新 更多