首页 文章

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

提问于
浏览
0

我想过滤 Firebase 中的数据 . 我收到了一些疑问,但我无法按照我的要求过滤数据 .

Data :

{
  "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 可用,那么从 Inner_3 给我一个主图层名称和最后 TEXT .

{
  "messages": {
    "Data_1": {
      "Text": {
        "-Kqgd6zZf51AdKNPrsX8": {
          "date": 1501840047829,
          "text": "hello"
        }
      }
    }
  }
}

请帮我实现这个结果 .

2 回答

  • 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

  • 0

    您必须通过密钥.orderByKey()进行排序,并获取lastone,rember firebase push keys ar随机字符串,其中包含时间戳 .

    最常见的排序方法是ref.orderByKey() . 它通过键来命令ref的孩子,通常按键 - 按时间顺序排列 .

    按键排序快照后,您可以执行以下操作:

    var firstdata;
     snapshot.forEach(function(mySnapshot) {
      if (!firstdata) {
      firstdata = mySnapshot.val();
       }
      });
      console.log(firstdata);
    

相关问题