Firebase 等于一个 属性 和 orderBy 另一个

Firebase equalTo one property and orderBy another

我几乎可以肯定,仅使用 firebase 无法解决我的问题,但让我试试。 我必须让一个特定的节点按另一个值排序,更好地解释:我必须让所有 children "empregado" 按 "data" 排序。 这是我的数据:

"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();});

我得到了数据,但我需要按 child "data" 排序,所以我认为这可以通过类似的方式解决:

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

但是它说我不能使用两次"orderByChild" 想法??? 从现在开始谢谢。

你是对的,你的 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

然后将检索所有需要的节点,并按顺序对它们进行排序。