1

我在节点 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" ]
        },
}

唯一的 id 将被添加到每个文档的 users 数组中。

每当添加唯一 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();
     });
})
4

1 回答 1

0

您在这里违反了 Firebase 的两项建议:

  1. 不要嵌套数据
  2. 不要将数据存储在数组中

不要嵌套数据

您大多被这里的嵌套所困扰:如果您只想收听 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;
})
于 2016-12-31T18:27:32.477 回答