如何检索不常见的数据

时间:2017-12-23 18:01:01

标签: typescript firebase firebase-realtime-database

我有一个带有"标记"的firebase数据库。树和"用户"树。每个用户都有一些标签(在这种情况下命名为首选项)相关联。它的数据库结构如下:

enter image description here

我想在列表中针对确定的用户显示用户不具备的所有偏好。

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;
     }) 
  }

我希望我已正确解释了我的问题。如果您需要更多代码或其他详细信息,请询问。提前谢谢。

1 个答案:

答案 0 :(得分:1)

我想我不妨用粗略的代码示例提交答案。

您的想法是加载两个快照(preferenzetag集合)。你可以,例如将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
        })
}

我没有运行或测试代码,因此可能存在错误。但我希望你明白这个想法!