我正在开发一个与PHP后端连接的Ionic项目,但我开始在Firebase数据库中存储一些数据,以便加快我的应用程序交互。
我目前正在存储这样的帖子:
-/posts
- /20 (User group ID)
- /8 (User ID)
- _postKey1
- _postKey2
- _postKey3
因此,当用户登录应用时,我会从后端获取群组和用户ID,因此我可以使用像/posts/20/8/
这样的引用从Firebase数据库获取帖子。
到目前为止工作正常,但为了让其他用户角色能够看到这些帖子,我只将帖子密钥存储在订阅者集合中,例如:
- /subscribers
- /88 (The subscriber id)
- _postKey1
- _postKey2
- _postKey3 (subscriber has access to see these posts from /posts/ collection)
当我订阅者登录应用时,我必须获取此用户的帖子密钥,然后为每个人/posts/20/8/_postKey1
,/posts/20/8/_postKey2
拨打电话,以便检索帖子对于此订阅者。
我很确定我正在构建意大利面条代码,所以我试图了解如何做得更好。
非常感谢!
代码示例
var ref = firebase.database().ref('/subscribers/88');
var postsRef = firebase.database().ref('posts/20/8');
// Get posts keys for this subscriber
ref.orderByChild('reverseDate').once("value", function(data) {
// save post keys
postKeys = data.val();
// go trhough each post key
Object.keys(postKeys).forEach(function(key) {
// get the real post
postsRef.child(postKeys[key].id).once("value", function(
if(null !== data.val()) {
// Append post to html list
}
});
});
});
答案 0 :(得分:0)
Firebase数据库无法查询子键的值(多个,在下面的示例中为key1,key2)。因此,尽可能保持集合平坦是一个好主意。 像这样的东西
csrfFilter(CsrfFilter, new HttpSessionCsrfTokenRepository()) {
accessDeniedHandler = ref('fnAccessDeniedHandler')
requireCsrfProtectionMatcher = ref('fnRequireCsrfProtectionMatcher')
}
使用此架构,您可以运行deep path queries并使用postCreationTimestamp进行排序/限制
posts:{
key1:{
postdata:"",
author:userId,
subscribers:{
userId1:postCreationTimestamp (or just a true val if you handle sorting with postkey),
userId2:postCreationTimestamp
}
},
key2:{...}
}
我们在这里所做的就是在创建帖子时用户对他/她所有帖子的重复订阅者。 但它带有价格;如果您希望新订阅者可以看到用户现有帖子,那么您应该运行一个后台作业,该作业开始向所有发布作者的帖子添加新的订阅者ID