Is this a valid way of getting all relational items in firebase?

83 Views Asked by At

first of all i'm new to firebase and non-relational databases. I have spent a couple of days now to try and figure out how to do this efficient.

i have the following data structure in my fb:

{
  "Messages" : {
    "-JsG-ltFluSRQvbhY8bh" : {
      "header" : "Message Header One",
      "content" : "Message content",
      "private" : "true"
    },
    "-JsGOTpo-67v8l_3J1wr" : {
      "header" : "Message Header Two",
      "content" : "Message content",
      "private" : "true"
    }
  },
  "publicMessages" : {
    "-JsG-ltFluSRQvbhY8bh" : "true",
    "-JsGOTpo-67v8l_3J1wr" : "true"
  }
}

Is this a valid way of getting all items from "Messages" that are set to true in "publicMessages"? OR is there a more effective way of getting them? say there are more than 1000 public Messages.

var messagesRef = new Firebase("https://xxx.firebaseIO.com/Messages");
var publicMessagesRef = new Firebase("https://xxx.firebaseIO.com/publicMessages");

publicMessagesRef.once("value", function(snap) {
    var keys = Object.keys(snap.val());
    keys.forEach(function(key){
        messagesRef.child(key).once("value", function(snapMsg) {
            // assign messages to $scope with $apply
        });
    });
});

/**************** EDIT

I got a good solution on my first question but still i dont understand how i compare two paths for example: (same as original question but with different paths)

"select" all Messages WHERE 

Message exists in users/simplelogin:3/auth_read_messages/

AND Messages/$message/private = true *(maybe this is not necessary)*

WHERE $message is the id for stored messages

{
  "Messages" : {
    "-JsN2eNBAg3jT3D__hCS" : {
      "auth_read" : {
        "simplelogin:2" : "true",
        "simplelogin:3" : "true"
      },
      "name" : "Message 259",
      "private" : true,
      "public" : false
    },
    "-JsNEcngthaVSxhNcmRy" : {
      "auth_read" : {
        "simplelogin:3" : "true"
      },
      "name" : "Message 907",
      "private" : true,
      "public" : false
    }
  },
  "users" : {
    "simplelogin:2" : {
      "auth_read_messages" : {
        "-JsN2eNBAg3jT3D__hCS" : true
      },
      "email" : "[email protected]",
      "name" : "Namn Namnsson"
    },
    "simplelogin:3" : {
      "auth_read_messages" : {
        "-JsNEcngthaVSxhNcmRy" : true,
        "-JsN2eNBAg3jT3D__hCS" : true
      },
      "email" : "[email protected]",
      "name" : "John Name"
    }
  }
}
1

There are 1 best solutions below

2
On BEST ANSWER

I think the easiest and btw. best way to approach it would be to set public key directly on each message object. It makes more sense since it is a message object's property.

Then you can search for them like that:

ref.orderByChild('public').equalTo('true').on('value', function(snapshot) {
   ...
});

You can find more information about this here: https://www.firebase.com/docs/web/guide/retrieving-data.html#section-queries