使用OrderByChild的Firebase查询数据

Query data with Firebase with OrderByChild

本文关键字:查询 数据 Firebase OrderByChild 使用      更新时间:2023-09-26

我有以下数据结构

{
  "advisors" : {
    "0ea9bab6-415e-4900-8698-ac03a1ef4518" : {
      "description" : "",
      "price" : 0,
      "title" : ""
    },
    "cc31c353-ca6a-440d-b188-af2016f72aef" : {
      "description" : "",
      "price" : 0,
      "title" : ""
    },
    "d8403e9b-fb74-4425-874f-2d125cd07a68" : {
      "description" : "I know every corner in the arab countries.",
      "price" : "50",
      "title" : "Best guide in the middle east"
    }
  },
  "advisors-countries" : {
    "0ea9bab6-415e-4900-8698-ac03a1ef4518" : {
      "Angola" : "true"
    },
    "cc31c353-ca6a-440d-b188-af2016f72aef" : {
      "Angola" : "true"
    }
  },

我想提出以下问题:给我所有顾问的价格,他们的名单中有安哥拉。

我尝试了下一个代码,只检索安哥拉=true的Advisor国家的孩子。

var advisors = (ref.orderByChild("Angole").equalTo(true));
$scope.users = $firebaseArray(advisors);
console.log("sync ", $scope.users);

但我在advisors对象中一直得到null对象。

要使用AngularFire轻松完成查询,您需要修改数据结构。

"advisors-countries" : {
    "0ea9bab6-415e-4900-8698-ac03a1ef4518" : {
      "Angola" : "true",
      "price": 0
    },
    "cc31c353-ca6a-440d-b188-af2016f72aef" : {
      "Angola" : "true",
      "price": 0
    }
}

您应该在advisors-countries位置中包括价格和任何其他相关数据。如果你担心重复数据,那没关系。您可以使用多路径更新来保持数据的一致性。

然后你的查询会起作用:

var query = ref.orderByChild("Angola").equalTo(true);

现在,为什么$scope.users为null

当您将$scope.users记录到控制台时,它将是null,因为一开始没有数据。下载数据是一个异步操作,因此一开始它不可用。

要调试此操作,请使用$loaded()

$scope.users = $firebaseArray(advisors);
$scope.users.$loaded().then(function(data) {
  console.log(data);
  console.log(data === $scope.users);
});

在第一个日志中,您将获得所有存在的数据。在第二个日志中,您将看到data参数与$scope.users对象相同。这意味着您不必使用$loaded(),因为当可用时,它将在您的模板中使用。