2017-06-05 60 views
0

我在取得复杂结构的Firebase数据时遇到问题。 我有这样的结构:Firebase查询参考:true

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

您当前的数据结构允许您有效地对已到过特定位置的所有用户进行处理。它不允许你高效地查询特定用户去过的所有地方。

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

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

+0

太谢谢你了。然而,这种数据结构是否可扩展? – pat3ck029