Javascript 按键值限制firebase返回的对象

Javascript 按键值限制firebase返回的对象,javascript,firebase-realtime-database,Javascript,Firebase Realtime Database,我有一个表单,允许用户向google fireBase DB提交数据,我有一个单独的页面,其中列出了在表单中填写信息的人以及他们得出的数字 我试图将返回结果限制为只有一个具有特定键值的对象,fireBase文档说您可以使用equalTo来限制结果 我的问题是,随着时间的推移,用户将提交多个提交,而下面列出的对象键将具有重复出现的值aka user我如何只显示其中一个 下面是fireBase返回给我的示例对象 "abc1234567891012346" : { "user" : "Frank

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

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

我的问题是,随着时间的推移,用户将提交多个提交,而下面列出的对象键将具有重复出现的值aka 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
}
生成上述代码的代码是以下代码段my codebase

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

}

有一种方法可以做到这一点,而无需客户端或云函数中的自定义代码。与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中的一个共同主题:您通常会最终建模和复制数据,以允许应用程序的用例。此外,由于需要更新复制数据以提高读取性能,因此会牺牲写入性能


要了解更多信息,我建议阅读和查看。

您显示的JSON节点没有属性用户,因此您的orderByChild“用户”似乎什么都不做。你能显示你开始使用的最小JSON,以及你想要的结果吗?上面显示的JSON与firebase返回给我的格式相同,我更正了JSON以显示属性存在。谢谢。这很有帮助,因为现在JSON中存在您正在排序的属性。但我仍然不确定你想要完成什么,你有什么问题。您当前的代码有什么不起作用?目前,项目1和3是同一个用户,我只希望从数据库返回其中一个。用户:James Miller提交了另一个提交,只返回最近的提交。我不知道该怎么做。