Firebase中的多个WHERE子句在查询中 [英] Firebase multiple WHERE clause in query

查看:127
本文介绍了Firebase中的多个WHERE子句在查询中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图只在抵达日期和机场相匹配时才返回航班数据的数据。我似乎无法弄清楚这个最好的解决方案。我只能拉机场或到达日期相同的数据,而不是两个(只能使用equalTo()一次)。以下是我目前的java代码:

$ p $ Firebase ref = mFirebaseRef.child(FirebaseReference.CHILD_FLIGHTS);
查询queryRef = ref.orderByChild(airport)。equalTo(getAirport());
queryRef.addListenerForSingleValueEvent(new ValueEventListener(){
@Override
public void onDataChange(DataSnapshot dataSnapshot){
System.out.println(TAG +datasnapshot is equal to+ dataSnapshot);


}

以下是数据本身:

  {
flight:{
1ddf3c02-1f2e-4eb7-93d8-3d8d4f9e3da2: {
airport:瑞典哥德堡 - Landvetter(GOT),
arrivalDate:2016-06-21,
arrivalTime:20:58,
code:GOT,
departureDate:2016-06-23,
departureTime:20:58
},
c2c86e54-b4d0-4d83-934b-775a86f0a16c:{
airport:Gothenburg,Sweden - Landvetter(GOT),
arrivalDate:2016-06-21,
arrivalTime:20:50,
code:GOT,
departureDate:2016-06-23,
departureTime: 20:50

},
users:{
1ddf3c02-1f2e-4eb7-93d8-3d8d4f9e3da2:{
age:25,
createdTime:1466533088358,
email:test2@test.com,
provider:password,
sex:M ,
username:user2
},
c2c86e54-b4d0-4d83-934b-775a86f0a16c:{
age:25,
createdTime:1466374588255,
email:test1@test.com,
provider:密码,
sex:M,
username:user1
}
}
}

当前的java代码将返回所有只有 的机场具有相同的机场。正如你所猜测的,当需要对客户端进行排序的数据量远大于上述测试数据时,这是不可行的。实时数据库不支持多个where子句,但是您可以创建一个或多个子查询

您的flight列表中的航班可以有一个组合键arrivalDatecode



<$ p
airport:瑞典哥德堡 - 兰特维特(GOT),
到达日期:$ d code $ c>1ddf3c02-1f2e-4eb7-93d8-3d8d4f9e3da2 2016-06-21,
arrivalTime:20:58,
arrivalDate_code:2016-06-21_GOT,//组合键
code: GOT,
departureDate:2016-06-23,
departureTime:20:58
}
pre>

然后您可以查询该键。

  Firebase ref = mFirebaseRef.child(FirebaseReference.CHILD_FLIGHTS); 
Query queryRef = ref.orderByChild(arrivalDate_code)。equalTo(2016-06-21_GOT);
queryRef.addListenerForSingleValueEvent(new ValueEventListener(){
@Override $ b $ public void onDataChange(DataSnapshot dataSnapshot){
$ b}
});

另一个选项是关闭数据结构中的字段:

  /航班
/ $ code
/ $ flight_id

这意味着您的数据将如下所示:

 flight:{ 
GOT:{
1ddf3c02-1f2e-4eb7-93d8-3d8d4f9e3da2:{
airport:Gothenburg,Sweden - Landvetter(GOT),
arrivalDate:2016-06-21,
arrivalTime:20:58,
code:GOT,
departureDate:2016-06- 23,
departureTime:20:58
}
}
}

然后你可以制定一个这样的查询:

  Firebase ref = mFirebaseRef.child (FirebaseReference.CHILD_FLIGHTS); 
Query queryRef = ref.child(GOT)。orderByChild(arrivalTime)。equalTo(2016-06-21_GOT);
queryRef.addListenerForSingleValueEvent(new ValueEventListener(){
@Override $ b $ public void onDataChange(DataSnapshot dataSnapshot){
$ b}
});


I'm trying to retreive data where flight data is returned only when the arrival date and airport match. I can't seem to figure out the best solution for this. I can only pull data where either the airport or arrival date is the same, not both (can only use equalTo() once). Here is what my current java code looks like:

                Firebase ref = mFirebaseRef.child(FirebaseReference.CHILD_FLIGHTS);
                Query queryRef = ref.orderByChild("airport").equalTo(getAirport());
                queryRef.addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        System.out.println(TAG + " datasnapshot is equal to " + dataSnapshot);


                    }

Here's the data itself:

{
"flight" : {
  "1ddf3c02-1f2e-4eb7-93d8-3d8d4f9e3da2" : {
  "airport" : "Gothenburg, Sweden - Landvetter (GOT)",
  "arrivalDate" : "2016-06-21",
  "arrivalTime" : "20:58",
  "code" : "GOT",
  "departureDate" : "2016-06-23",
  "departureTime" : "20:58"
},
"c2c86e54-b4d0-4d83-934b-775a86f0a16c" : {
  "airport" : "Gothenburg, Sweden - Landvetter (GOT)",
  "arrivalDate" : "2016-06-21",
  "arrivalTime" : "20:50",
  "code" : "GOT",
  "departureDate" : "2016-06-23",
  "departureTime" : "20:50"
}
},
"users" : {
"1ddf3c02-1f2e-4eb7-93d8-3d8d4f9e3da2" : {
  "age" : "25",
  "createdTime" : "1466533088358",
  "email" : "test2@test.com",
  "provider" : "password",
  "sex" : "M",
  "username" : "user2"
},
"c2c86e54-b4d0-4d83-934b-775a86f0a16c" : {
  "age" : "25",
  "createdTime" : "1466374588255",
  "email" : "test1@test.com",
  "provider" : "password",
  "sex" : "M",
  "username" : "user1"
}
}
}

The current java code will return all children which only have the same airport. As you could guess, this isn't feasible when the amount of data which will need to be sorted client side is much larger than the above test data. How can I better filter the data on firebase's end?

解决方案

The Realtime Database does not support multiple where clauses but you can create an extra key to make it possible.

A "flight" in your "flight" list can have a combined key for "arrivalDate" and "code".

"1ddf3c02-1f2e-4eb7-93d8-3d8d4f9e3da2" : {
  "airport" : "Gothenburg, Sweden - Landvetter (GOT)",
  "arrivalDate" : "2016-06-21",
  "arrivalTime" : "20:58",
  "arrivalDate_code": "2016-06-21_GOT", // combined key
  "code" : "GOT",
  "departureDate" : "2016-06-23",
  "departureTime" : "20:58"
}

Then you can query for that key.

Firebase ref = mFirebaseRef.child(FirebaseReference.CHILD_FLIGHTS);
Query queryRef = ref.orderByChild("arrivalDate_code").equalTo("2016-06-21_GOT");
queryRef.addListenerForSingleValueEvent(new ValueEventListener() {
   @Override
   public void onDataChange(DataSnapshot dataSnapshot) {

   }
});

Another option is to key off of a field in the data structure:

/ flights
  / $code
    / $flight_id

This means your data would look like this:

"flight" : {
  "GOT": {
    "1ddf3c02-1f2e-4eb7-93d8-3d8d4f9e3da2" : {
      "airport" : "Gothenburg, Sweden - Landvetter (GOT)",
      "arrivalDate" : "2016-06-21",
      "arrivalTime" : "20:58",
      "code" : "GOT",
      "departureDate" : "2016-06-23",
      "departureTime" : "20:58"
    }
  }
}

And then you could formulate a query like this:

Firebase ref = mFirebaseRef.child(FirebaseReference.CHILD_FLIGHTS);
Query queryRef = ref.child("GOT").orderByChild("arrivalTime").equalTo("2016-06-21_GOT");
queryRef.addListenerForSingleValueEvent(new ValueEventListener() {
   @Override
   public void onDataChange(DataSnapshot dataSnapshot) {

   }
});

这篇关于Firebase中的多个WHERE子句在查询中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆