在第7个子实时数据库之后,“实时转换"数据库.到json数组 [英] After 7th child Realtime database "convert" to json array
问题描述
我正在尝试创建一个每天执行的作业,此过程将创建一个子级DAY并在DAY内添加多个子级HOUR,问题是当我尝试添加7个以上子级时,实时数据库会转换我的JSON树在一个数组中.
I'm trying to create a job to execute each day, this procedure will create a child DAY and add many children HOUR inside DAY, the problem is when I try to add more than 7 child, Realtime Database converts my JSON tree in an array.
我想要这个JSON结果:
I want this JSON result:
{
"CALENDAR" : {
"8" : {
"AVAILABLE" : true,
"PURCHASEKEY" : "NA",
"TIME" : "8:00",
"TITLE" : "NA",
"USERID" : "NA",
"USERNAME" : "NA"
},
"9" : {
"AVAILABLE" : true,
"PURCHASEKEY" : "NA",
"TIME" : "9:00",
"TITLE" : "NA",
"USERID" : "NA",
"USERNAME" : "NA"
}
.
.
.
"19" : {
"AVAILABLE" : true,
"PURCHASEKEY" : "NA",
"TIME" : "19:00",
"TITLE" : "NA",
"USERID" : "NA",
"USERNAME" : "NA"
}
}
}
但是,如果我插入到HOUR 19,则在Realtime Database上插入数据的结果是这样的:
But if i insert until HOUR 19, result of insert data on Realtime Database is this:
{
"CALENDAR" : [ null, null, null, null, null, null, null, null, {
"AVAILABLE" : true,
"PURCHASEKEY" : "NA",
"TIME" : "8:00",
"TITLE" : "NA",
"USERID" : "NA",
"USERNAME" : "NA"
}, {
"AVAILABLE" : true,
"PURCHASEKEY" : "NA",
"TIME" : "9:00",
"TITLE" : "NA",
"USERID" : "NA",
"USERNAME" : "NA"
},
.
.
.
{
"AVAILABLE" : true,
"PURCHASEKEY" : "NA",
"TIME" : "19:00",
"TITLE" : "NA",
"USERID" : "NA",
"USERNAME" : "NA"
} ]
}
如果我仅添加7个孩子就可以了,结果是这样的:
If i add just 7 child works fine, the result is this:
{
"CALENDAR" : {
"8" : {
"AVAILABLE" : true,
"PURCHASEKEY" : "NA",
"TIME" : "8:00",
"TITLE" : "NA",
"USERID" : "NA",
"USERNAME" : "NA"
},
"9" : {
"AVAILABLE" : true,
"PURCHASEKEY" : "NA",
"TIME" : "9:00",
"TITLE" : "NA",
"USERID" : "NA",
"USERNAME" : "NA"
},
.
.
.
"14" : {
"AVAILABLE" : true,
"PURCHASEKEY" : "NA",
"TIME" : "14:00",
"TITLE" : "NA",
"USERID" : "NA",
"USERNAME" : "NA"
}
}
}
我正在使用Function创建此数据,我的代码是:
I'm using Function to create this data, my code is:
exports.createDayHour = functions.pubsub.schedule('every day 00:00').onRun(async context => {
var day = moment().add(2,'days').format('dddd')
var _day = moment().add(3,'days').format('DDMMYYYY')
if(day !== 'Saturday' || day !== 'Sunday'){
await admin
.database()
.ref('CALENDAR')
.set({
8 : {
"AVAILABLE" : true,
"PURCHASEKEY" : "NA",
"TIME" : "8:00",
"TITLE" : "NA",
"USERID" : "NA",
"USERNAME" : "NA"
},
9 : {
"AVAILABLE" : true,
"PURCHASEKEY" : "NA",
"TIME" : "9:00",
"TITLE" : "NA",
"USERID" : "NA",
"USERNAME" : "NA"
},
10 : {
"AVAILABLE" : true,
"PURCHASEKEY" : "NA",
"TIME" : "10:00",
"TITLE" : "NA",
"USERID" : "NA",
"USERNAME" : "NA"
},
11 : {
"AVAILABLE" : true,
"PURCHASEKEY" : "NA",
"TIME" : "11:00",
"TITLE" : "NA",
"USERID" : "NA",
"USERNAME" : "NA"
},
12 : {
"AVAILABLE" : true,
"PURCHASEKEY" : "NA",
"TIME" : "12:00",
"TITLE" : "NA",
"USERID" : "NA",
"USERNAME" : "NA"
},
13 : {
"AVAILABLE" : true,
"PURCHASEKEY" : "NA",
"TIME" : "13:00",
"TITLE" : "NA",
"USERID" : "NA",
"USERNAME" : "NA"
}
})
}
});
我尝试了很多方法,使用FOR循环,异步功能..但没有成功.请有人知道我的代码有什么问题吗?
I tried so many ways, using FOR looping, async func..but not success. Please someone know what wrong of my code?
推荐答案
您看到的是Firebase客户端对看起来像数组的数据执行的数组强制.无法启用/禁用它,但是您可以通过确保键看起来不像数组索引来绕过它.
What you're seeing is the array-coercion that the Firebase clients do on data that looks like an array. There's no way to enable/disable it, but you can bypass it by ensuring your keys don't look like array indexes.
最简单的方法是在所有键之前加上固定的字符串,例如"hour _"
.所以:
The simplest way to do that is to prefix all your keys with a fixed string, like "hour_"
. So:
{
"CALENDAR" : {
"hour_08" : {
"AVAILABLE" : true,
"PURCHASEKEY" : "NA",
"TIME" : "8:00",
"TITLE" : "NA",
"USERID" : "NA",
"USERNAME" : "NA"
},
"hour_09" : {
"AVAILABLE" : true,
"PURCHASEKEY" : "NA",
"TIME" : "9:00",
"TITLE" : "NA",
"USERID" : "NA",
"USERNAME" : "NA"
},
这使键成为真实的字符串,因此Firebase客户端不会再将它们误认为是数组索引.
This makes the keys be real strings, so the Firebase clients won't mistake them for array indices anymore.
正如您在示例中看到的那样,我还建议您将值填充为始终为2位数字,以使它们始终具有相同的长度.现在可能不需要,但是在某些时候可能会很有帮助.
As you can see in the example, I'd also recommend padding the values to always be 2 digits, so that they're always the same length. This might not be needed now, but it may be very helpful at some point.
这篇关于在第7个子实时数据库之后,“实时转换"数据库.到json数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!