Angularjs Angularfire:如何通过其中一个访问项目&x27;谁的财产?
我的Firebase数据的组织方式如下: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" + ... + ... + ... 如何按客户名称检索客户? 该名称保证是唯一的。 这是我的
+ 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:没错,我的问题几乎与另一个问题完全相同……很抱歉,在询问之前我没有找到它。。。