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"
}
}
}
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:
You can find more information about this here: https://www.firebase.com/docs/web/guide/retrieving-data.html#section-queries