如何(使用单个HTTP请求 REST API )向Firebase写入数组并为每个数组元素提供一个(非整数)唯一ID ?
<小时/>
我必须写的数据如下所示。
数据到write.jsmyArray = [ {"user_id": "jack", "text": "Ahoy!"},
{"user_id": "jill", "text": "Ohai!"} ];
完成后,我希望我的Firebase看起来像这样。
my-firebase.firebaseio.com{
"posts": {
"-JRHTHaIs-jNPLXOQivY": { // <- unique ID (non-integer)
"user_id": "jack",
"text": "Ahoy!"
},
"-JRHTHaKuITFIhnj02kE": { // <- unique ID (non-integer)
"user_id": "jill",
"text": "Ohai!"
}
}
}
我不希望它看起来如下......
my-anti-firebase.firebaseio.com// NOT RECOMMENDED - use push() instead!
{
"posts": {
"0": { // <- ordered array index (integer)
"user_id": "jack",
"text": "Ahoy!"
},
"1": { // <- ordered array index (integer)
"user_id": "jill",
"text": "Ohai!"
}
}
}
I note this page where it says:
[...]如果所有键都是整数,并且0和对象中最大键之间的键的一半以上具有非空值,则Firebase会将其渲染为数组。
因为我想在单个HTTP请求中执行此操作,所以我希望避免迭代数组中的每个元素,而是希望在单个请求中推送批处理。
换句话说,我想做这样的事情:
pseudocode.jscurl -X POST -d '[{"user_id": "jack", "text": "Ahoy!"},
{"user_id": "jill", "text": "Ohai!"}]' \
// I want some type of batch operation here
'https://my-firebase.firebaseio.com/posts.json'
然而,当我这样做时,我得到了我上面描述的我不想要的东西(即顺序整数键)。
我想避免做这样的事情:
抗pseudocode.jsfor(i=0; i<=myArray.length; i++;){ // I want to avoid iterating over myArray
curl -X POST -d '{"user_id": myArray[i]["user_id"],
"text": myArray[i]["text"]}' \
'https://my-firebase.firebaseio.com/posts.json'
}
有可能完成我所描述的内容吗?如果是这样,怎么样?
答案 0 :(得分:1)
我认为有一种方法可以使用Firebase API来执行此操作,如OP中所述。
但是,可以使用服务器脚本完成,如下所示:
patch
方法通过单个HTTP请求将对象写入Firebase。因为post
为整个对象本身创建了一个新的Firebase生成的ID。鉴于,patch
没有;它直接写入父节点。var myObject = {},
i = myArray.length;
while(i--){
var key = function(){ /* return unique ID */ }();
myObject[key] = myArray[i];
}
curl -X PATCH -d JSON.stringify(myObject) \
'https://my-firebase.firebaseio.com/posts.json'
答案 1 :(得分:0)
仅当您使用POST
时,Firebase才会生成唯一ID。如果您使用PATCH
,则不会生成唯一ID。
因此,对于给定的情况,将需要迭代使用一些服务器/客户端代码来保存firebase中的数据。
伪码:
For each array
curl -X POST -d
"user_id": "jack",
"text": "Ahoy!"
'https://my-firebase.firebaseio.com/posts.json'
Next
答案 2 :(得分:0)
您决定使用POST是正确的。导致数字索引作为键的那个是因为您的有效负载是一个数组。无论何时发布/ put和数组,键都将始终为索引。如果您希望服务器为您生成密钥,请逐个发布您的对象。