firebase和node js:将值添加到列表时的事件

时间:2016-12-31 18:15:58

标签: javascript node.js firebase firebase-realtime-database firebase-admin

我在节点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();
     });
})

1 个答案:

答案 0 :(得分:0)

您违反了Firebase的两项建议:

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

    你大部分都被这里的嵌套所困扰:如果你只想听一个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;
    })