按键值限制firebase返回的对象

时间:2017-11-02 17:01:30

标签: javascript firebase-realtime-database

我有一个允许用户向google fireBase DB提交数据的表单,我有一个单独的页面,其中显示了填写表单信息的人员列表以及他们提供的数据。

我试图将返回结果限制为只有一个具有特定键值的对象,fireBase文档说你可以使用" equalTo"限制结果。

我的问题是用户会随着时间的推移提交多次提交,下面列出的对象密钥将具有重复发生的值,即#34; user"我该怎么做只显示其中一个?

下面是一个示例对象fireBase返回给我。

"abc1234567891012346" : {
   "user" : "Frank Albert",
   "email" : "example@company.com",
   "address" : "123 Some where nice",
   "socialspend" : 10,000,
   "printimpact" : 180,000
},

"abc1238567891012346" : {
   "user" : "James Miller",
   "email" : "example@company.com",
   "address" : "123 Some where nice",
   "socialspend" : 500,
   "printimpact" : 24,500
},

"abc1234567891014348" : {
   "user" : "Frank Albert",
   "email" : "example@company.com",
   "address" : "123 Some where nice",
   "socialspend" : 10,800,
   "printimpact" : 80,000
},

"abc12341267891012346" : {
   "user" : "Jessica Smith",
   "email" : "example@company.com",
   "address" : "123 Some where nicer",
   "socialspend" : 2,560,
   "printimpact" : 70,800
}

生成上述内容的代码是以下代码段我的代码库

 var usersList = firebase.ref('campaignSubmission');

usersList.orderByChild('user').limitToLast(5).once('value')
.then(function(snapshot){

    var cpSumission = snapshot.val();
    keys = Object.keys(cpSumission);
    console.log(cpSumission);

    for(var i = 0; i < keys.length; i++) {
        var k = keys[i];

        // Store whats needed for displaying later
        var listEmployeeName = cpSumission[k].user;
        var listSocialSpend = cpSumission[k].printimpact;
        ...
    }

}

1 个答案:

答案 0 :(得分:0)

如果没有自定义代码(客户端或云端功能),就可以这样做。与NoSQL数据库一样,解决方案是为您的用例扩充数据模型。在这种情况下,您似乎想要阅读每个用户的最新提交,这也是我在数据库中建模的内容:

"latestSubmissionByUserName": {
   "Frank Albert": {
      "uid": "abc1234567891012346",
      "email" : "example@company.com",
      "address" : "123 Some where nice",
      "socialspend" : 10,000,
      "printimpact" : 180,000
   }
   "James Miller": {
      "uid": "abc1238567891012346",
      "email" : "example@company.com",
      "address" : "123 Some where nice",
      "socialspend" : 500,
      "printimpact" : 24,500
   },
   "Jessica Smith": {
      "uid": "abc12341267891012346",
      "email" : "example@company.com",
      "address" : "123 Some where nicer",
      "socialspend" : 2,560,
      "printimpact" : 70,800
   }
}

由于我们在此处使用user属性作为关键字,因此根据定义可以不重复。因此,阅读每个用户的最新提交变得如此简单:

var usersList = firebase.ref('latestSubmissionByUserName');

usersList.orderByKey().once('value').then(function(snapshot){
   snapshot.forEach(function(userSnapshot) {
      console.log(userSnapshot.key);
   });
});

另一个用例可能是您想要阅读用户列表,在这种情况下我会精确地模拟:

"userNames": {
   "Frank Albert": true,
   "James Miller": true,
   "Jessica Smith": true
}

上面的相同代码也会从中读取/记录用户名。

这两种方法都突出了NoSQL数据库中的一个共同主题,特别是Firebase:您通常会最终建模和复制数据以允许您的应用程序的用例。此外,您牺牲写入性能(因为您需要更新重复数据)以获得读取性能。

要详细了解这一点,建议您阅读NoSQL data modeling并查看Firebase for SQL developers