是否有可能在firebase中获得一系列唯一值?

时间:2015-09-17 02:30:50

标签: angularjs firebase angularfire

考虑存储在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构建查询以返回其中一个子节点的唯一值数组。例如,返回["IPA", "Pale Wheat"]

3 个答案:

答案 0 :(得分:4)

不,您无法在集合中查询每个项目的特定属性的唯一值。您可以对此类值进行过滤,因此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
    }
  }
}

答案 1 :(得分:0)

Firebase没有对数组的本机支持。如果存储数组,它实际上存储为“对象”,整数作为键名。

// we send this
['IPA', 'Pale Wheat']
// Firebase stores this
{0: 'IPA', 1: 'Pale Wheat'}

答案 2 :(得分:0)

弗兰克说,不。将您想要SELECT DISTINCT的分组归一化。就我而言,我想填充城市和州的下拉列表(HTML Select Group),这些列表是我每次会议的键/值对。所以,我将使用状态下拉填充我的“状态”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);
    }
}

enter image description here