我的firebase用户树具有以下结构:
用户:
{
{
'userName': 'abc',
'userEmail' : 'abc@abc.com',
'userPreferences':
[
0:'Cinema',
1:'It'
]
},
{
'userName': 'abc',
'userEmail' : 'abc@abc.com',
'userPreferences':
[
0:'Cinema',
1:'Music'
]
}
}
然后,我尝试找到他们的偏好列表包含的所有用户' Cinema' 我试试这段代码:
var ref1 = new Firebase("https://event-application.firebaseio.com/users");
$scope.user = $firebaseArray(ref1.orderByChild("userpreferences").equalTo('Cinema'));
console.log($scope.user);
答案 0 :(得分:1)
您的JSON结构将首选项显示为userPreferences,因此以下工作不会起作用吗?
var ref1 = new Firebase("https://event-application.firebaseio.com/users");
$scope.user = $firebaseArray(ref1.orderByChild("userPreferences").equalTo('Cinema'));
console.log($scope.user);
但是我认为你的代码还存在另一个问题,你被称为.equalTo('Cinema')
但是你将它与数组进行比较,如果我错了就纠正我,但我不认为这种行为.equalTo('Cinema')
是循环遍历每个值并进行比较,我认为这只是一个直接的比较
如果是这种情况,您可能需要通过从firebase读取数据并通过快照可用的功能对其进行操作来构建自定义查询
答案 1 :(得分:1)
在NoSQL中,您经常会得到一个反映应用程序使用数据方式的数据模型。如果您想要阅读所有喜欢Cinema的用户,您应该在树中对其进行建模:
users: {
'uid-of-abc': {
'userName': 'abc',
'userEmail' : 'abc@abc.com',
'userPreferences': [
0:'Cinema',
1:'It'
]
},
'uid-of-def': {
'userName': 'def',
'userEmail' : 'abc@abc.com',
'userPreferences': [
0:'Cinema',
1:'Music'
]
}
},
"preferences-lookup": {
"Cinema": {
"uid-of-abc": true,
"uid-of-def": true
},
"It": {
"uid-of-abc": true
},
"Music": {
"uid-of-def": true
}
}
现在您可以通过以下方式了解用户喜欢的电影:
ref.child('preferences-lookup/Cinema').on('value', function(snapshot) {
snapshot.forEach(function(userKey) {
console.log(userKey.key()+' prefers Cinema');
});
});
此blog post on denormalizing data with Firebase,Firebase documentation on structuring data以及Stack Overflow上的几十个答案中都包含了这一点。一些: