我在节点js上使用firebase。
下面是我的数据模型
"sList" : {
"-K_KxnexiRMvC81bTEVH" : {
"description" : "sdf",
"name" : "sdf",
"users" : [ "-K_Kxnf9XBnClTgFv67z", "-K_KvlWOiNCOBDL-Vl3y" ]
},
"-K_KxnexiRMvC81asdabTEVHas" : {
"description" : "sdf",
"name" : "pdsff",
"users" : [ "-K_Kxnf9XBnClTgasv67z", "-K_KvlWOiNCsadOBDL-Vl3y" ]
},
}
将在每个文档的users数组中添加唯一ID。
每当添加唯一ID时,如何在每个文档中的所有用户数组上添加事件侦听器
以下代码我试过,但没有工作
var listRef = firebaseAdmin.database().ref('/sList');
listRef.on('child_changed', function(dataSnapshot) {
const msg= dataSnapshot.val();
const key= dataSnapshot.key();
var userRef = listRef.child();
userRef.on('child_changed', function(childDataSnapshot) {
const val=childDataSnapshot.val();
});
})
答案 0 :(得分:0)
您违反了Firebase的两项建议:
你大部分都被这里的嵌套所困扰:如果你只想听一个sList的用户,你应该分别存储这些数据。幸运的是,这很容易解决:
"sList" : {
"-K_KxnexiRMvC81bTEVH" : {
"description" : "sdf",
"name" : "sdf",
},
"-K_KxnexiRMvC81asdabTEVHas" : {
"description" : "sdf",
"name" : "pdsff",
},
},
"sListUsers": {
"-K_KxnexiRMvC81bTEVH" : [ "-K_Kxnf9XBnClTgFv67z", "-K_KvlWOiNCOBDL-Vl3y" ],
"-K_KxnexiRMvC81asdabTEVHas" : [ "-K_Kxnf9XBnClTgasv67z", "-K_KvlWOiNCsadOBDL-Vl3y" ]
}
因此,我们将两个列表保存为相同的密钥,这样您就可以查找用户或 sList的元数据。
听取用户然后变得简单:
var listRef = firebaseAdmin.database().ref('/sListUsers/-K_KxnexiRMvC81bTEVH');
listRef.on('child_added', function(dataSnapshot) {
const user = dataSnapshot.val();
})
第二个问题是您将用户存储在数组中:非唯一值的有序集合。但是,如果我们查看您拥有的内容,则更有可能希望将用户存储在唯一值的(可能是无序的)集合中。这种集合类型通常称为集。
在Firebase中,您的一组用户被建模为:
当应用于您的数据模式时,它变为:
"sList" : {
"-K_KxnexiRMvC81bTEVH" : {
"description" : "sdf",
"name" : "sdf",
},
"-K_KxnexiRMvC81asdabTEVHas" : {
"description" : "sdf",
"name" : "pdsff",
},
},
"sListUsers": {
"-K_KxnexiRMvC81bTEVH" : {
"-K_Kxnf9XBnClTgFv67z": true,
"-K_KvlWOiNCOBDL-Vl3y": true
},
"-K_KxnexiRMvC81asdabTEVHas" : {
"-K_Kxnf9XBnClTgasv67z": true,
"-K_KvlWOiNCsadOBDL-Vl3y": true
}
}
true
这里只是一个标记值,因为Firebase无法存储没有值的键。重要的是我们将用户的ID存储为密钥,这些密钥保证是唯一的。
您可以从这里获得用户:
var listRef = firebaseAdmin.database().ref('/sListUsers/-K_KxnexiRMvC81bTEVH');
listRef.on('child_added', function(dataSnapshot) {
const user = dataSnapshot.key;
})