Angularjs Angularfire:如何通过其中一个访问项目&x27;谁的财产?

Angularjs Angularfire:如何通过其中一个访问项目&x27;谁的财产?,angularjs,firebase,angularfire,angular-services,Angularjs,Firebase,Angularfire,Angular Services,我的Firebase数据的组织方式如下: + myappname + customers + -JV2NQv3GmoM81zdUfTe + name: "Mary" + age: "24" + ... + -JV2N9NnItCfz5vB04RS + name: "John" + age: "32" + ... + ... + ... 如何按客户名称检索客户? 该名称保证是唯一的。 这是我的

我的Firebase数据的组织方式如下:

+ myappname
  + customers
    + -JV2NQv3GmoM81zdUfTe
      + name: "Mary"
      + age: "24"
      + ...
    + -JV2N9NnItCfz5vB04RS
      + name: "John"
      + age: "32"
      + ...
    + ...
  + ...
如何按客户名称检索客户?
该名称保证是唯一的。
这是我的客户服务,目前:

app.factory('Customer', function ($firebase, FIREBASE_URL) {
  var ref = new Firebase(FIREBASE_URL + 'customers');
  var customers = $firebase(ref);

  var Customer = {
    all: customers,
    create: function (customer) {
      return customers.$add(customer).then(function (ref) {
        var customerId = ref.name();
        return customerId;
      });
    },
    set: function(customerId, customer) {
      return customers.$child(customerId).$set(customer);
    },
    find: function (customerId) {
      return customers.$child(customerId);
    },
    findByName: function (customerName) { // TODO...
    },
    delete: function (customerId) {
      var customer = Customer.find(customerId);
      customer.deleted = true;
      customer.$on('loaded', function () {
        customers.$child(customerId).$set(customer);
      });
    }
  };
  return Customer;
});
我应该扫描每个findByName()调用上的所有客户吗?
或者我应该建立类似“二级索引”的东西吗?

请给我一些建议,我才刚开始…:-(

多亏了加藤的指示和弗兰克·范·帕夫伦的建议,我终于解决了自己的问题。
我确实在Firebase中添加了一个“索引”,“CustomerByName”(记住“磁盘空间很便宜,用户的时间不是”Firebase座右铭…:-)。
我没有遵循参考答案中的方向,因为我认为此解决方案具有更广泛的用途:它可扩展为多个“索引”…
我想把它贴在这里,希望它能对其他人有用。
我希望看到评论:这个解决方案是否有可能的缺点?总的来说,对于某些用例来说,它是一个明智的解决方案吗

app.factory('Customer', function ($firebase, FIREBASE_URL) {
  var ref = new Firebase(FIREBASE_URL + 'customers');
  var customers = $firebase(ref);
  var refByName = new Firebase(FIREBASE_URL + 'customersByName');
  var customersByName = $firebase(refByName);

  var Customer = {
    all: customers,
    create: function (customer) {
      return customers.$add(customer).then(function (ref) {
        var customerId = ref.name();
        customersByName.$child(customer.name).$set(customerId);
        return customerId;
      });
    },
    set: function(customerId, customer) {
      var oldname = customers.$child(customerId).name;
      if (customer.name !== oldname) {
        customersByName.$remove(oldname);
      }
      customersByName.$child(customer.name).$set(customerId);
      return customers.$child(customerId).$set(customer);
    },
    find: function (customerId) {
      return customers.$child(customerId);
    },
    findByName: function (customerName) {
      return customersByName.$child(customerName);
    },
    delete: function (customerId) {
      var customer = Customer.find(customerId);
      customer.deleted = true;
      customer.$on('loaded', function () {
        customersByName.$remove(customer.name);
        customers.$child(customerId).$set(customer);
      });
    }
  };

  return Customer;
});

可能的重复即使您刚刚开始,您已经指定了两种可能的解决方案。Firebase允许您按节点名称或其优先级搜索节点。如果您尚未将优先级用于任何其他内容,则可以将名称设置为优先级,并使用
Query.startAt
Query.endAt
按名称选择。如果您已经在为其他内容使用优先级,您确实可以创建一个单独的索引,仅用于将用户名映射到节点名称。@Kato:没错,我的问题几乎与另一个问题完全相同……很抱歉,在询问之前我没有找到它。。。