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

Javascript firebase和node js:将值添加到列表时发生的事件,javascript,node.js,firebase,firebase-realtime-database,firebase-admin,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" : {

我在节点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将添加到每个文档的用户数组中

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

您在此处违反了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;
    })
    

    您在此处违反了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;
    })
    

    你能为上述答案发布firebase添加查询吗?你能为上述答案发布firebase添加查询吗