Firebase equalTo一个属性和orderBy另一个

时间:2016-04-07 16:47:41

标签: firebase firebase-realtime-database

我几乎可以肯定我的问题没有使用firebase的解决方案,但让我试试。 我必须得到一个特定的节点按其他值排序,更好地解释:我必须让所有孩子“empregado”按“数据”排序。 这是我的数据:

"ponto" : {
"-KEggOdWvibrLfpptyfX" : {
  "data" : "04/04/2016",
  "empregado" : "-KEHl6qtSG7UkZU8Gi4t",
  "entradaM" : "07:03",
  "entradaT" : "12:01",
  "equipe" : "-KDYYDYMqc0l0irnOGjP",
  "horas" : "09:00",
  "horas100" : "",
  "horas50" : "",
  "obra" : "-KDcuiLXj8IgVB5RalLS",
  "observacao" : "tsts",
  "saidaM" : "11:01",
  "saidaT" : "17:00"
},
"-KEggYHd7bBkv04XSx2C" : {
  "data" : "05/04/2016",
  "empregado" : "-KEHl6qtSG7UkZU8Gi4t",
  "entradaM" : "07:01",
  "entradaT" : "12:02",
  "equipe" : "-KDYYDYMqc0l0irnOGjP",
  "horas" : "09:00",
  "horas100" : "",
  "horas50" : "01:00",
  "obra" : "-KDcuiLXj8IgVB5RalLS",
  "observacao" : "tsts",
  "saidaM" : "11:01",
  "saidaT" : "18:00"
},...more data with repeated key "empregado" and not repeated too

所以,我做了:

ref.child("ponto").orderByChild("empregado").equalTo("-KEHl6qtSG7UkZU8Gi4t").on("child_added", function(snapshot) {
                        ponto = snapshot.val();});

并且我完全得到了数据,但我需要通过子“数据”来订购它,所以我认为这可以通过类似的方式解决:

ref.child("ponto").orderByChild("data").orderByChild("empregado").equalTo("-KEHl6qtSG7UkZU8Gi4t").on("child_added", function(snapshot) {
                        ponto = snapshot.val();});

但它说我不能使用两次“orderByChild” 想法? 谢谢你。

1 个答案:

答案 0 :(得分:0)

您是对的,您的orderByChild定义了您要查询的字段,因此无法使用两次。

此外,使用04/04/2016之类的日期可能会成为稍后排序的问题,因此您可能希望将它们存储为20160404.

您的开发平台尚未指定,但数据可以非常轻松地加载和编码。

作为解决方案,您可以使用组合索引

"-KEggOdWvibrLfpptyfX" : {
  "data" : "04/04/2016",
  "empregado" : "-KEHl6qtSG7UkZU8Gi4t",
  "entradaM" : "07:03",
  "entradaT" : "12:01",
  "equipe" : "-KDYYDYMqc0l0irnOGjP"
  "id_date_index": "-KDYYDYMqc0l0irnOGjP_20160404"
},
"-KEggYHd7bBkv04XSx2C" : {
  "data" : "05/04/2016",
  "empregado" : "-KEHl6qtSG7UkZU8Gi4t",
  "entradaM" : "07:01",
  "entradaT" : "12:02",
  "equipe" : "-KDYYDYMqc0l0irnOGjP"
  "id_date_index": "-KDYYDYMqc0l0irnOGjP_20160504"
}

然后你的查询将是

    ref.queryOrderedByChild("id_date_index").queryStartingAtValue("-KDYYDYMqc0l0irnOGjP_0")
        .observeEventType(.ChildAdded, withBlock: { snapshot in

        if ( snapshot.value is NSNull ) {
            print("not found)")

        } else {
            print(snapshot.value)
        }

    })

这里的概念是我们知道我们想要查询什么,在这种情况下是" -KDYYDYMqc0l0irnOGjP_0"所以这是静止的。

变量是日期,因此我们制作了一个将静态与变量

组合在一起的索引

static_variable

由于变量是数字且可以是连续的,我们使用queryStartingAt从零开始查询:

-KDYYDYMqc0l0irnOGjP_0

然后将检索所有所需节点,并按顺序排序。