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
然后将检索所有需要的节点,并按顺序对它们进行排序。
我几乎可以肯定,仅使用 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
然后将检索所有需要的节点,并按顺序对它们进行排序。