这是在 Firebase 中获取所有相关项的有效方法吗?
Is this a valid way of getting all relational items in firebase?
首先,我是 firebase 和非关系数据库的新手。
我已经花了几天时间来尝试找出如何有效地做到这一点。
我的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"
}
}
这是从 "Messages" 中获取所有在 "publicMessages" 中设置为 true 的项目的有效方法吗?或者有没有更有效的方法来获取它们?假设有超过 1000 public 条消息。
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
});
});
});
/**************** 编辑
我的第一个问题得到了很好的解决方案,但我仍然不明白我是如何比较两条路径的
例如:(与原始问题相同,但路径不同)
"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 是存储消息的 ID
{
"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" : "o@mail.se",
"name" : "Namn Namnsson"
},
"simplelogin:3" : {
"auth_read_messages" : {
"-JsNEcngthaVSxhNcmRy" : true,
"-JsN2eNBAg3jT3D__hCS" : true
},
"email" : "s@mail.se",
"name" : "John Name"
}
}
}
我认为最简单,顺便说一句。最好的方法是直接在每个消息对象上设置 public
键。它更有意义,因为它是消息对象的 属性。
然后你可以这样搜索:
ref.orderByChild('public').equalTo('true').on('value', function(snapshot) {
...
});
您可以在此处找到更多相关信息:https://www.firebase.com/docs/web/guide/retrieving-data.html#section-queries
首先,我是 firebase 和非关系数据库的新手。 我已经花了几天时间来尝试找出如何有效地做到这一点。
我的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"
}
}
这是从 "Messages" 中获取所有在 "publicMessages" 中设置为 true 的项目的有效方法吗?或者有没有更有效的方法来获取它们?假设有超过 1000 public 条消息。
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
});
});
});
/**************** 编辑
我的第一个问题得到了很好的解决方案,但我仍然不明白我是如何比较两条路径的 例如:(与原始问题相同,但路径不同)
"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 是存储消息的 ID
{
"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" : "o@mail.se",
"name" : "Namn Namnsson"
},
"simplelogin:3" : {
"auth_read_messages" : {
"-JsNEcngthaVSxhNcmRy" : true,
"-JsN2eNBAg3jT3D__hCS" : true
},
"email" : "s@mail.se",
"name" : "John Name"
}
}
}
我认为最简单,顺便说一句。最好的方法是直接在每个消息对象上设置 public
键。它更有意义,因为它是消息对象的 属性。
然后你可以这样搜索:
ref.orderByChild('public').equalTo('true').on('value', function(snapshot) {
...
});
您可以在此处找到更多相关信息:https://www.firebase.com/docs/web/guide/retrieving-data.html#section-queries