我想过滤Firebase
中的数据。我收到了一些疑问,但我无法根据我的要求过滤数据
数据:
{
"messages": {
"Data_1": {
"Inner_3": {
"Text": {
"-Kqgd2_QSi5HIlyH6Om3": {
"date": 1501840029764,
"text": "hi"
},
"-Kqgd6zZf51AdKNPrsX8": {
"date": 1501840047829,
"text": "hello"
}
}
}
},
"Data_2": {
"Inner_2": {
"Text": {
"-Kqm5GijxFT54wZRHIJj": {
"date": 1.501931572192E9,
"text": "hi"
},
"-Kqm5YohOG1cFWO-WNGc": {
"date": 1.501931646257E9,
"text": "test"
},
"-Kqm6935IY8Ddj20Z3TN": {
"date": 1.501931802871E9,
"text": "new message"
}
}
}
}
}
}
在上面的json中,如果我通过Inner_3
那么它应该返回到结果以下。如果arrays
可用,则会检入所有Inner_3
,然后从TEXT
为我提供包含最后Inner_3
的主要图层名称。
{
"messages": {
"Data_1": {
"Text": {
"-Kqgd6zZf51AdKNPrsX8": {
"date": 1501840047829,
"text": "hello"
}
}
}
}
}
请帮我实现这个结果。
答案 0 :(得分:1)
很遗憾,Firebase数据库无法进行此类查询。您必须更改数据结构以适应它。
一种方法是将Inner_3
添加为已知属性的值:
{
"messages": {
"Data_1": {
"Key": "Inner_3"
"Inner_3": {
"Text": {
"-Kqgd2_QSi5HIlyH6Om3": { "date": 1501840029764, "text": "hi" },
"-Kqgd6zZf51AdKNPrsX8": { "date": 1501840047829, "text": "hello" }
}
}
},
"Data_2": {
"Key": "Inner_2"
"Inner_2": {
"Text": {
"-Kqm5GijxFT54wZRHIJj": { "date": 1.501931572192E9, "text": "hi" },
"-Kqm5YohOG1cFWO-WNGc": { "date": 1.501931646257E9, "text": "test" },
"-Kqm6935IY8Ddj20Z3TN": { "date": 1.501931802871E9, "text": "new message" }
}
}
}
}
}
现在您可以查询:
ref.child("messages").orderByChild("Key").equalTo("Inner_3")
或者,您可以添加单独的查找列表:
"InnerToNodeNameMapping": {
"Inner_3": "Data_1",
"Inner_2": "Data_2"
}
然后,您可以通过直接查找找到Inner_3
项的路径:
ref.child("InnerToNodeNameMapping").child("Inner_3")
从中你可以直接访问节点(无需查询)。
必须调整/扩展您的数据结构以允许您在应用中使用的用例在Firebase和其他NoSQL数据库中非常常见。由于您对NoSQL似乎比较新,我建议您阅读NoSQL data modeling
答案 1 :(得分:0)
你必须通过密钥.orderByKey()订购,然后获取lastone,rember firebase推送的密钥和包含时间戳的随机字符串。
最常见的排序方法是ref.orderByKey()。它通过键来命令ref的孩子,通常按键 - 按时间顺序排列。
按键排序快照后,您可以执行以下操作:
var firstdata;
snapshot.forEach(function(mySnapshot) {
if (!firstdata) {
firstdata = mySnapshot.val();
}
});
console.log(firstdata);