Sihem Hcine
Sihem Hcine

Reputation: 1129

Query data from firebase Array

My firebase users tree has this structure:

users:

{
 {
 'userName': 'abc',
 'userEmail' : '[email protected]',
 'userPreferences': 
   [ 
     0:'Cinema', 
     1:'It' 
   ] 
  },
  {
 'userName': 'abc',
 'userEmail' : '[email protected]',
 'userPreferences': 
   [ 
     0:'Cinema', 
     1:'Music' 
   ] 
 }
 } 

Then, I try to find all users that their preference list contain 'Cinema'.
I try this code:

var ref1 = new Firebase("https://event-application.firebaseio.com/users"); 
$scope.user = $firebaseArray(ref1.orderByChild("userpreferences").equalTo('Cinema'));
console.log($scope.user); 

But I don't get the best result. I get this record: enter image description here

Upvotes: 0

Views: 967

Answers (2)

Frank van Puffelen
Frank van Puffelen

Reputation: 600100

In NoSQL you'll often end up with a data model that reflects the way your application uses the data. If you want to read all the users that have a preference for Cinema, you should model that in your tree:

users: {
   'uid-of-abc': {
     'userName': 'abc',
     'userEmail' : '[email protected]',
     'userPreferences': [ 
        0:'Cinema', 
        1:'It' 
     ] 
   },
   'uid-of-def': {
     'userName': 'def',
     'userEmail' : '[email protected]',
     '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
  }
}

Now you can find out what users prefer cinema with:

ref.child('preferences-lookup/Cinema').on('value', function(snapshot) {
  snapshot.forEach(function(userKey) {
    console.log(userKey.key()+' prefers Cinema');
  });
});

This is covered in this blog post on denormalizing data with Firebase, in the Firebase documentation on structuring data and in dozens of answers here on Stack Overflow. A few:

Upvotes: 1

Grant
Grant

Reputation: 447

Your JSON structure shows preferences as userPreferences, so wouldn't the following work?

var ref1 = new Firebase("https://event-application.firebaseio.com/users"); 
$scope.user = $firebaseArray(ref1.orderByChild("userPreferences").equalTo('Cinema'));
console.log($scope.user);

However I think there is also another problem with your code, you're called an .equalTo('Cinema') however you're comparing it to an array, correct me if i'm wrong but I don't think the behaviour of .equalTo('Cinema') is to loop through each of the values and compare them, I think it's just a straight up comparison

If this is the case, you may need to build a custom query by reading the data from firebase and manipulating it via function available to a snapshot

Upvotes: 1

Related Questions