从firebase Array查询数据

时间:2016-04-28 10:56:56

标签: angularjs firebase angularfire firebase-realtime-database

我的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); 

但我没有得到最好的结果。我得到这个记录: enter image description here

2 个答案:

答案 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 FirebaseFirebase documentation on structuring data以及Stack Overflow上的几十个答案中都包含了这一点。一些: