Firebase查询参考:true

时间:2017-06-05 23:16:48

标签: javascript firebase firebase-realtime-database

我在使用复杂结构的firebase上获取数据时遇到问题。 我有这样的结构:

place1: {
 visits: {
  user1: true,
  user2: true,
  user3: true,
  user4: true
 }
},
place2: {
 visits: {
  user1: true,
  user3: true,
  user4: true
 }
},
place3: {
 visits: {
  user2: true,
  user3: true,
  user4: true
 }
}

如何查询到过所有地方的所有用户?

非常感谢你的帮助!

1 个答案:

答案 0 :(得分:1)

您当前的数据结构可以让您有效地为去过特定地点的所有用户做好准备。它不允许您有效地查询特定用户去过的所有地方。

要允许第二个查询,您应该添加第二个数据结构:

user1: {
  place1: true,
  place2: true
},
user2: {
  place1: true,
},
user3: {
  place1: true,
  place3: true
},
user4: {
  place1: true,
  place2: true,
  place3: true,
  place4: true
}

使用这个额外的结构(通常称为倒置索引),您可以找到每个用户去过的地方。

由于您现在有两种结构,因此您需要确保将每次访问添加到两个地方。单个多位置更新可以实现:

function recordVisitor(uid, placeid) {
  var updates = {};
  updates[`/userVisits/${uid}/${placeid}`] = true;
  updates[`placeVisitors/${placeid}/${uid}`] = true;
  firebase.database().ref().update(updates);
}

另请参阅我对相关用例(查询类别中的项目)的回答,该用例也需要倒排索引:http://stackoverflow.com/questions/40656589/firebase-query-if-child-of-child-contains-a-value