TL;博士;
REST API 的解决方法:添加一个像这样的无意义过滤器orderBy="$.key"&startAt="0"
,它实际上过滤掉所有带有负键的项目):https ://workaround-arrays-bagohack.firebaseio.com/matchesHeuristic.json?orderBy= %22 $key%22&startAt =%220%22&打印=漂亮
解释
这是 Firebase 的一种已知且不幸的 (IMHO) 行为,在其支持知识库中有深入记录。引用最佳实践:Firebase 中的数组:
Firebase 没有对数组的原生支持。如果你存储一个数组,它实际上会被存储为一个以整数作为键名的“对象”。
// we send this
['hello', 'world']
// Firebase stores this
{0:'hello', 1: 'world'}
但是,为了帮助在 Firebase 中存储数组的人,当您调用.val()
或使用 REST api 读取数据时,如果数据看起来像数组,Firebase 会将其呈现为数组。
特别是,*如果所有键都是整数,并且对象中 0 到最大键之间的键中有一半以上具有非空值,则 Firebase 会将其呈现为数组。后一部分很重要,请牢记。
您目前无法更改或阻止此行为。希望理解它可以更容易地了解在存储类似数组的数据时可以做什么和不能做什么。
因此,我为您设置了一个小型复制器。原始数据:
{
"matchesHeuristic": {
"1": {
"id": "foo",
"value": "bar"
},
"2": {
"id": "w",
"value": "tf"
}
},
"notMatchesHeuristic": {
"1": {
"id": "foo",
"value": "bar"
},
"365": {
"id": "w",
"value": "tf"
}
}
}
Firebase REST API 返回:https : //workaround-arrays-bagohack.firebaseio.com/.json ?print=pretty
{
"matchesHeuristic" : [ null, {
"id" : "foo",
"value" : "bar"
}, {
"id" : "w",
"value" : "tf"
} ],
"notMatchesHeuristic" : {
"1" : {
"id" : "foo",
"value" : "bar"
},
"365" : {
"id" : "w",
"value" : "tf"
}
}
}
如您所见,matchesHeuristic
对象被转换为索引为 0 处为空值的数组(因为它与 Firebase 文档中定义的启发式方法相匹配),而notMatchesHeuristic
保持不变。如果您像我们一样拥有动态数据,这尤其“好” - 所以我们直到运行时才知道它是否会匹配启发式。
解决方法(REST API)
然而,这部分文档似乎并不成立:
您目前无法更改或阻止此行为。希望理解它可以更容易地了解在存储类似数组的数据时可以做什么和不能做什么。
您实际上可以通过请求按键搜索的项目来解决这个问题,所以
{"1":{"id":"foo","value":"bar"},"2":{"id":"w","value":"tf"}}
注意:有趣的是,Firebase 支持人员似乎不知道这种解决方法(至少当我们向他们询问这种行为时他们没有建议)。