是否有可能在 firebase 中获得一组唯一值?
Is it possible to get an array of unique values in firebase?
考虑存储在 Firebase 中的以下数据:
{
"beers": {
"-jwhkclclmecl": {
"name": "Two Hearted Ale",
"type": "IPA",
"brewery": "Bells"
},
"-ckqjheh292od": {
"name": "Dirty Blonde Ale",
"type": "Pale Wheat",
"brewery": "Atwater"
},
"-hcwiu3cp902d": {
"name": "Diabolical",
"type": "IPA",
"brewery": "North Peak"
}
}
}
是否可以为 Firebase 构建查询以 return 一个子节点的唯一值数组。例如 return ["IPA", "Pale Wheat"]
不,您不能在集合中查询每个项目的特定 属性 的唯一值。您可以过滤此类值,因此 ref.child('beers').orderByChild('type').equalTo('IPA')
。但这不是你要问的。 :-)
通常,如果您希望在 Firebase(或大多数其他 NoSQL 数据库)中执行此类操作,您会将项目(或对项目的引用)保存在一个组中:
{
"beer_types": {
"IPA": {
"-jwhkclclmecl": {
"name": "Two Hearted Ale",
"brewery": "Bells"
},
"-hcwiu3cp902d": {
"name": "Diabolical",
"brewery": "North Peak"
}
},
"Pale Wheat": {
"-ckqjheh292od": {
"name": "Dirty Blonde Ale",
"brewery": "Atwater"
},
}
}
}
当然,这只有在您只想将它们保留在一个类别中时才有效。如果您想要多个类别,您可以将对每个项目的引用存储在多个类别下:
{
"beers": {
"-jwhkclclmecl": {
"name": "Two Hearted Ale",
"type": "IPA",
"brewery": "Bells"
},
"-ckqjheh292od": {
"name": "Dirty Blonde Ale",
"type": "Pale Wheat",
"brewery": "Atwater"
},
"-hcwiu3cp902d": {
"name": "Diabolical",
"type": "IPA",
"brewery": "North Peak"
}
}
"beer_types": {
"IPA": {
"-jwhkclclmecl": true,
"-hcwiu3cp902d": true
},
"Pale Wheat": {
"-ckqjheh292od": true
}
},
"breweries": {
"Bells": {
"-jwhkclclmecl": true
},
"Atwater": {
"-ckqjheh292od": true
}
"North Peak": {
"-hcwiu3cp902d": true
}
}
}
Firebase 本身不支持数组。如果你存储一个数组,它实际上被存储为一个“对象”,以整数作为键名。
// we send this
['IPA', 'Pale Wheat']
// Firebase stores this
{0: 'IPA', 1: 'Pale Wheat'}
正如弗兰克所说,不。非规范化您想要 SELECT DISTINCT 的分组。在我的例子中,我想为城市和州填充下拉列表(HTML Select 组),我的每个会议都是 key/value 对。因此,我将在状态下拉菜单中填充我的 "states" firebase 节点的结果。选择州后,我将使用该州的城市列表填充城市下拉列表。
至于如何在 Firebase 中创建这个组,下面是我想到的。只需将 "city" 和 "state" 更改为 "item" 和 "group" 即可满足您的需要。无需在写入时检查重复项,因为它们不是默认写入的。此函数将创建您的组(注意:在调用此函数之前让您的字符串 .toLowerCase())
function setCity(city,state){
if (city && state){
var statesRef = ref.child('states');
var stateRef = statesRef.child(state);
var obj = {};
obj[city] = true;
stateRef.update(obj);
}
}
考虑存储在 Firebase 中的以下数据:
{
"beers": {
"-jwhkclclmecl": {
"name": "Two Hearted Ale",
"type": "IPA",
"brewery": "Bells"
},
"-ckqjheh292od": {
"name": "Dirty Blonde Ale",
"type": "Pale Wheat",
"brewery": "Atwater"
},
"-hcwiu3cp902d": {
"name": "Diabolical",
"type": "IPA",
"brewery": "North Peak"
}
}
}
是否可以为 Firebase 构建查询以 return 一个子节点的唯一值数组。例如 return ["IPA", "Pale Wheat"]
不,您不能在集合中查询每个项目的特定 属性 的唯一值。您可以过滤此类值,因此 ref.child('beers').orderByChild('type').equalTo('IPA')
。但这不是你要问的。 :-)
通常,如果您希望在 Firebase(或大多数其他 NoSQL 数据库)中执行此类操作,您会将项目(或对项目的引用)保存在一个组中:
{
"beer_types": {
"IPA": {
"-jwhkclclmecl": {
"name": "Two Hearted Ale",
"brewery": "Bells"
},
"-hcwiu3cp902d": {
"name": "Diabolical",
"brewery": "North Peak"
}
},
"Pale Wheat": {
"-ckqjheh292od": {
"name": "Dirty Blonde Ale",
"brewery": "Atwater"
},
}
}
}
当然,这只有在您只想将它们保留在一个类别中时才有效。如果您想要多个类别,您可以将对每个项目的引用存储在多个类别下:
{
"beers": {
"-jwhkclclmecl": {
"name": "Two Hearted Ale",
"type": "IPA",
"brewery": "Bells"
},
"-ckqjheh292od": {
"name": "Dirty Blonde Ale",
"type": "Pale Wheat",
"brewery": "Atwater"
},
"-hcwiu3cp902d": {
"name": "Diabolical",
"type": "IPA",
"brewery": "North Peak"
}
}
"beer_types": {
"IPA": {
"-jwhkclclmecl": true,
"-hcwiu3cp902d": true
},
"Pale Wheat": {
"-ckqjheh292od": true
}
},
"breweries": {
"Bells": {
"-jwhkclclmecl": true
},
"Atwater": {
"-ckqjheh292od": true
}
"North Peak": {
"-hcwiu3cp902d": true
}
}
}
Firebase 本身不支持数组。如果你存储一个数组,它实际上被存储为一个“对象”,以整数作为键名。
// we send this
['IPA', 'Pale Wheat']
// Firebase stores this
{0: 'IPA', 1: 'Pale Wheat'}
正如弗兰克所说,不。非规范化您想要 SELECT DISTINCT 的分组。在我的例子中,我想为城市和州填充下拉列表(HTML Select 组),我的每个会议都是 key/value 对。因此,我将在状态下拉菜单中填充我的 "states" firebase 节点的结果。选择州后,我将使用该州的城市列表填充城市下拉列表。
至于如何在 Firebase 中创建这个组,下面是我想到的。只需将 "city" 和 "state" 更改为 "item" 和 "group" 即可满足您的需要。无需在写入时检查重复项,因为它们不是默认写入的。此函数将创建您的组(注意:在调用此函数之前让您的字符串 .toLowerCase())
function setCity(city,state){
if (city && state){
var statesRef = ref.child('states');
var stateRef = statesRef.child(state);
var obj = {};
obj[city] = true;
stateRef.update(obj);
}
}