Firebase等于动态嵌套子

时间:2016-04-20 10:14:27

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

结构为

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

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

是否可以查询archive参考并获取所有archiveObjects foo = 1?或者我是否需要取下整个表格,手动挖掘$userId并提取archiveObjects我正在寻找?

1 个答案:

答案 0 :(得分:2)

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