将对象数组保存到 firebase 而不获取 0,1,2...作为键

use*_*902 7 javascript firebase firebase-realtime-database angularfire2 angular

我有一个 javascript 对象数组,如下所示。

jsObjFromCsv = 
[ 
    {
        "J251525" : {
            "APPROVER" : "TOM@MAIL.COM",
            "JOB DESCRIPTION " : "CLEAN THE HOUSE",
            "JOB NUMBER" : "J251525"
        }
    }, {
        "J512912" : {
            "APPROVER" : "JAMES@MAIL.COM",
            "JOB DESCRIPTION " : "BRUSH HORSE",
            "JOB NUMBER" : "J512912"
        }
    }, {
        "J5-512" : {
            "APPROVER" : "HARRY@MAIL.COM",
            "JOB DESCRIPTION " : "WASH CAR",
            "JOB NUMBER" : "J5-512"
            }
    } 
]
Run Code Online (Sandbox Code Playgroud)

但是,当我使用以下代码保存到 firebase 时,它​​看起来像这样

firebase 截图 - 不好

saveJobToFirebase(jobs: Array<Object>) {
    const jobCodesRef = this.af.database.list('/jobCodes/' +  this.currentUser.company)
    return jobCodesRef.push(jobs);
}
Run Code Online (Sandbox Code Playgroud)

我想摆脱 0,1,2 这样我就可以查询终点

jobCodes/Company1/-Kc8Q5Wuq4M91puQ_70J/J251525
Run Code Online (Sandbox Code Playgroud)

-----------------我的尝试--------------

我已经想到了一种有效的方法,但它似乎并不像本文末尾所解释的那样好。

所以为了实现我想要的,我首先将我的对象数组更改为以下内容

[ 
    {
        "APPROVER" : "TOM@MAIL.COM",
        "JOB DESCRIPTION " : "CLEAN THE HOUSE",
        "JOB NUMBER" : "J251525"

    }, {
        "APPROVER" : "JAMES@MAIL.COM",
        "JOB DESCRIPTION " : "BRUSH HORSE",
        "JOB NUMBER" : "J512912"

    }, {
        "APPROVER" : "HARRY@MAIL.COM",
        "JOB DESCRIPTION " : "WASH CAR",
        "JOB NUMBER" : "J5-512"

    } 
]
Run Code Online (Sandbox Code Playgroud)

然后我循环遍历每个对象并获取一个作业号以获取终点并使用以下代码直接将其“设置”到 firebase

saveJobToFirebase(jobs: Array<Object>) {
    // previous code
    // const jobCodesRef = this.af.database.list('/jobCodes/' +  this.currentUser.company)
    // return jobCodesRef.push(jobs);

    // bad attempt?  
    for (let job of jobs) {
        const jobCodesRef = this.af.database.object('/jobCodes/' +  this.currentUser.company + '/' + job['JOB NUMBER']).set(job);
    }
}
Run Code Online (Sandbox Code Playgroud)

这给了我想要的结果。

firebase 截图-myattempt

但是,这种方法有两个大问题

  1. 我的 saveJobToFirebase 不再返回 thenableReference 以便我在我的组件中调用 .then。这意味着我无法跟踪操作是否成功

  2. 我不知道用 for 循环更新 firebase 是否是个好主意?如果这个 JSON 对象有 2000 个条目怎么办……如果我在 for 循环中调用它,我会敲定终点。如果我可以“推送”它以便所有内容都在一个请求中进行会更好吗?

Fra*_*len 5

创建 0、1、2 等是因为您要保存对象数组。有关此行为存在的原因以及 Firebase 建议不要存储数组的更多信息,请参阅有关 Firebase 中数组的博客文章

调用push()将生成所谓的推送 ID,Firebase 保证该值是唯一的。但由于您的作业已经有自己的 ID,因此也不需要这样做。

保存的结构似乎更好:每个对象都有一个可用的键。您可以使用以下方法保存此对象:

jsObjFromCsv =  {
    "J251525" : {
        "APPROVER" : "TOM@MAIL.COM",
        "JOB DESCRIPTION " : "CLEAN THE HOUSE",
        "JOB NUMBER" : "J251525"
    },
    "J512912" : {
        "APPROVER" : "JAMES@MAIL.COM",
        "JOB DESCRIPTION " : "BRUSH HORSE",
        "JOB NUMBER" : "J512912"
    },
    "J5-512" : {
        "APPROVER" : "HARRY@MAIL.COM",
        "JOB DESCRIPTION " : "WASH CAR",
        "JOB NUMBER" : "J5-512"
        }
};
Run Code Online (Sandbox Code Playgroud)

如果你仔细观察,你会发现我已经移除了数组和最外层的对象。

现在您可以使用以下命令保存此对象:

const jobCodesRef = this.af.database.list('/jobCodes/' +  this.currentUser.company)
jobCodesRef.update(jsObjFromCsv);
Run Code Online (Sandbox Code Playgroud)

的返回值update()是 nnable,因此您可以在操作完成(或失败)后继续。