【问题标题】:firebase and node js : event when value added to the listfirebase 和 node js:将值添加到列表时的事件
【发布时间】:2016-12-31 18:15:58
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    您在这里违反了 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();
    })
    

    不要将数据存储为数组

    第二个问题是您将用户存储在一个数组中:非唯一值的有序集合。但是,如果我们查看您拥有的内容,您更有可能希望将用户存储在一个(可能是无序的)唯一值集合中。这种集合类型通常称为 set

    在 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添加查询
    猜你喜欢
    • 2018-05-23
    • 1970-01-01
    • 1970-01-01
    • 2021-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-26
    • 2012-04-23
    相关资源
    最近更新 更多