在Firebase中过滤数据(具有复杂查询)android

时间:2017-08-05 12:46:29

标签: android firebase filter firebase-realtime-database

我想过滤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"
        }
      }
    }
  }
}

请帮我实现这个结果。

2 个答案:

答案 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);