我有一个允许用户向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;
...
}
}
答案 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。