我有一个带有"标记"的firebase数据库。树和"用户"树。每个用户都有一些标签(在这种情况下命名为首选项)相关联。它的数据库结构如下:
我想在列表中针对确定的用户显示用户不具备的所有偏好。
Example:
Tags: 1, 2, 3, 4
User has 1,3
I want to show in a list, 2 and 4!
我有一个代码可以正确显示用户拥有的所有偏好/标签,但我不知道如何显示用户没有的内容列表!
这是我的代码,显示了常见的偏好(效果很好)
showUserPreferences(){
let userTag = [];
var ref = firebase.database().ref('/users/'+ this.email+'/preferenze/')
var ref1 = firebase.database().ref('/tag/');
ref.once('value', function(preferenze){
preferenze.forEach(function(singolaPref){
ref1.once('value', function(tags){
tags.forEach(function (singoloTag){
if(singolaPref.key == singoloTag.key){
userTag.push(singolaPref.child("nome").val())
}
return false;
})
})
return false;
})
}).then(a=>{
this.tags = userTag;
})
}
我希望我已正确解释了我的问题。如果您需要更多代码或其他详细信息,请询问。提前谢谢。
答案 0 :(得分:1)
我想我不妨用粗略的代码示例提交答案。
您的想法是加载两个快照(preferenze
和tag
集合)。你可以,例如将preferenze
保存在地图中以便于查找。然后在迭代标记时使用此映射。
showMissingPreferences() {
var preferencesRef = firebase.database().ref('/users/'+ this.email+'/preferenze/')
var tagsRef = firebase.database().ref('/tag/');
preferencesRef.once('value')
.then(userPrefSnap => {
// Save the user's tags in a map for lookup.
let userPrefMap: { [key: string]: boolean } = {}
userPrefSnap.forEach(userTagSnap => {
userPrefMap[userTagSnap.key] = true
})
return tagsRef.once('value')
.then((tagsSnap) => {
let missingTags = []
tagsSnap.forEach(tagSnap => {
// Only push the tag if it's not in the map.
if(!userPrefMap[tagSnap.key]) {
missingTags.push(tagSnap.child("nome").val())
}
})
return missingTags
})
})
.then(missingTags => {
this.tags = missingTags
})
}
我没有运行或测试代码,因此可能存在错误。但我希望你明白这个想法!