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

时间:2017-02-04 14:29:26

标签: javascript angular firebase firebase-realtime-database angularfire2

我有一个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"
            }
    } 
]

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

firebase screenshot -bad

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

我想摆脱0,1,2这样我可以像

那样查询终点
jobCodes/Company1/-Kc8Q5Wuq4M91puQ_70J/J251525

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

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

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

[ 
    {
        "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"

    } 
]

然后我循环遍历每个对象并获取一个作业号以获得终点并直接&#34; SET&#34;它使用以下代码到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);
    }
}

这给了我想要的结果。

firebase screenshot-myattempt

然而,这种方法存在两个大问题

  1. 我的saveJobToFirebase不再返回一个thenableReference让我在我的Component上调用.then。这意味着我无法跟踪操作是否成功

  2. 我不知道用for循环更新firebase是个好主意吗?如果这个JSON对象有2000个条目怎么办...如果我在for循环中调用它,我会敲定终点。如果我可以推动&#34;那会更好。这样一切都有一个请求吗?

3 个答案:

答案 0 :(得分:2)

创建0,1,2等,因为您正在保存对象数组。有关此行为存在的原因以及Firebase建议不要存储数组的原因,请参阅此blog post about arrays in 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"
        }
};

如果你仔细观察,你会发现我已经删除了阵列和最外层的物体。

现在您可以使用以下方法保存此对象:

const jobCodesRef = this.af.database.list('/jobCodes/' +  this.currentUser.company)
jobCodesRef.update(jsObjFromCsv);

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

答案 1 :(得分:0)

我有类似的问题,但在节点中,没有答案证明是足够的。我知道你的代码不同但原理是一样的。希望这可以帮助将来的某个人。第一个Firebase可以通过推送或设置等不同方式保存数据。当使用带方括号的数组时,按下会自动添加0,1,2这样的数字,这样两个人在博客上发布的同时不会互相覆盖。设置忽略此项并覆盖路径中的所有内容以保存指定的数据。

在我的情况下,我将json对象添加到带有.push的数组中并获取0,1,2和我想要的名称而不是0,1,2所以我基本上只是用对象切换数组而不是使用.push我在一个大对象里面设置了对象。为了说明这一点:

我先用过的东西:

var array = [];
jsonobject={
title:'title'
}

array.push(jsonobject);
//then I used push to firebase that array in an advanced method

修复:

var mybigjson = {};
var nameiwantinsteadofnumbers = [insert your changing variable for each jsonobject here]
jsonobject={
title:'title'
}

mybigjson[nameiwantinsteadofnumbers]=jsonobject
//then I used push to firebase that object in an advanced method

答案 2 :(得分:0)

对于感兴趣的任何人,请尝试只用几行reduce即可将对象数组转换为对象

void print() {
  if constexpr(std::is_base_of_v<T,Bar>) // ignores `Foo<int>`
    t.print();
}