当前位置: 首页 > 面试题库 >

通过查询AngularFire检索记录

万俟英锐
2023-03-14
问题内容

我将Firebase,后端即服务用于我的网站应用程序,并通过AngularJS进行编程。

我想使用数据库查询来获取记录,例如: WHERE name == 'The Legend Of Korra'

我在Firebase服务器中具有电视连续剧数组 JSON CODE

{
  "series" : {
    "-JkqSvwyDw5F9DvGUu6b" : {
      "createdAt" : 1426842959884,
      "creators" : "Michael Dante DiMartino,Bryan Konietzko",
      "description" : "The series follows the adventures of protagonist twelve-year-old Aang and his friends, who must bring peace and unity to the world by ending the Fire Lord's war against the other three nations.",
      "episode_reset" : true,
      "genres" : "Action,Adventure,Fantasy,Comedy-drama",
      "keywords" : "avatar,the last airbender",
      "name" : "Avatar: The Last Airbender",
      "official_website" : "http://nicktoons.nick.com/shows/avatar",
      "publish_date" : "2005-02-21",
      "updatedAt" : 1426843055127
    }
  }
}

我现在使用的代码来解决这个问题:

$scope.isSeriesValid = function(seriesName) {
    var seriesRef = new Firebase('http://<<firebaseapp>>.firebaseio.com/series');
    var seriesCollection = $firebaseArray(seriesRef);
    seriesCollection.$loaded(function() {
        angular.forEach(seriesCollection, function(seriesObject, index) {
            if(seriesObject.name == seriesName)
                return true;
        });
    });
    return false;
};

我想在不使用$firebaseArray和的情况下解决这个问题forEach。我应该怎么做?

就像这样:

var seriesRef = new Firebase('http://<<firebaseapp>>.firebaseio.com/series');
var seriesObject = $firebaseObject(seriesRef.query({ name: seriesName }));

问题答案:

我有一些建议可能会帮助您:

  • 查阅Firebase查询文档。特别,
    • .orderByChild()
    • .equalTo()
  • 您可以结合使用查询.$ref()来获取所需的记录。

  • 查看这个工作的 PLNKR示例
    • 我在我的一个公共Firebase实例中复制了您的数据。
    • 您要查找的查询是 seriesCollectionRef.orderByChild("name").equalTo(seriesName)
    • 如果在输入中输入“ Avatar: The Last Airbender”并单击“查找”,则将获得匹配的系列对象。
  • 在我的示例中,我扩展了$firebaseArray服务,以包括一种用于通过名称查找特定系列的方法。
    • 请参阅有关扩展AngularFire服务的文档。
    • 您可以在不扩展服务的情况下完成同样的事情,请参阅最后的代码片段。

工厂名称

app.factory('SeriesFactory', function(SeriesArrayFactory, fbUrl){
  return function(){
    var ref = new Firebase(fbUrl+'/series');
    return new SeriesArrayFactory(ref);
  }
});

app.factory('SeriesArrayFactory', function($firebaseArray, $q){
  return $firebaseArray.$extend({
    findSeries:function(seriesName){
      var deferred = $q.defer();
      // query by 'name'
      this.$ref().orderByChild("name").equalTo(seriesName).once("value", function(dataSnapshot){
        if(dataSnapshot.exists()){
          deferred.resolve(dataSnapshot.val());
        } else {
          deferred.reject("Not found.");
        }
      });
      return deferred.promise;
    }
  });
});

控制者

app.controller('HomeController',function($scope, SeriesFactory, fbUrl) {

  $scope.seriesName = '';

  $scope.findSeries = function() {
    console.log("Finding series with name:'",$scope.seriesName,"'");
    var seriesCollection = new SeriesFactory();
    seriesCollection.findSeries($scope.seriesName).then(function(data){
      console.log("Found",data);
      $scope.series = data;
    }).catch(function(error){
      console.warn(error);
    });
  };

});

没有扩展服务

如果您不使用工厂,则控制器功能如下所示:

  $scope.findSeriesWithoutFactory = function() {
    var seriesRef = new Firebase(fbUrl+'/series');
    var seriesCollection = $firebaseArray(seriesRef);
    seriesCollection.$ref().orderByChild("name").equalTo($scope.seriesName).once("value", function(dataSnapshot){
        var series = dataSnapshot.val();
        if(dataSnapshot.exists()){
          console.log("Found", series);
          $scope.series = series;
        } else {
          console.warn("Not found.");
        }
    });
  };

规则

注意:请 务必注意,您应该添加".indexOn":"name"Firebase规则,以使查询高效运行。像这样:

  • 请参阅《 Firebase 安全和规则指南》中的“为数据编制索引”部分。
      "yourfirebaseapp": {
        ".read": "...",
        ".write": "...",
        "series": {
          ".indexOn": "name"
        }
      }

希望有帮助!



 类似资料:
  • 问题内容: 文件夹中的文档很少,我想检查该文件夹中的所有文档是否都已编制索引。为此,对于该文件夹中的每个文档名称,我想循环遍历ES中索引的文档并进行比较。所以我想检索所有文档。 有喜欢同一个问题的其他几个可能的重复[检索AElasticSearch)NEST查询所有记录,并在此处输入链接的描述,但他们没有帮助我的文档已经从那个时候改变了。(有什么关于扫描当前文档中) 我尝试使用。但是根据文档,将检

  • 考虑到Laravel指南中的基本示例有许多通过关系,我试图直接查询雄辩的、帖子类型为100的国家(只是一个例子)。 type_id是我的特例... 因此,我在country模型中创建了一个关系,通过用户创建了与帖子的关系。我想要实现的结果是列出一个国家,以及每个国家内由该国用户创建的帖子。 我能够以其他方式复制我想要实现的结果,但是我想知道为什么下面雄辩的查询没有返回预期的结果: 查询的返回是几个

  • 问题内容: 我想构建一个由Instagram照片驱动的小型“即时图片搜索”应用。就像Google Instant,您可以在其中开始键入内容,并且在键入更多字母时显示/更新结果。 您可以看到由Google图片提供支持的实时演示应用。我知道使用大型引擎(Google,Yahoo!,Bing)是可行的,但我不知道Instagram是否允许这样做。任何熟悉API的人都可以提供帮助吗? 如果无法通过有意义的

  • 本文向大家介绍Android 检索查询参数,包括了Android 检索查询参数的使用技巧和注意事项,需要的朋友参考一下 示例 如果用户点击一个linkto http://www.example.com/map?param1=FOO&param2=BAR,那么param1这里将有一个价值"FOO"和param2将有一个价值"BAR"。

  • 问题内容: 我有一张桌子,上面有很多日期的记录。我想执行一个查询,该查询仅返回落在该日期月份的最后一天的记录。就像是: 除非这行不通,否则参数的右边应该是返回正确比较的月份的最后一天。 基本上有一种简洁的方法可以进行这种比较吗?等效于四分之一的终端也将非常有帮助,但无疑会更加复杂。 编辑: 本质上,我想检查给定的日期是否是它所属的月份(或季度)中的最后一个。如果是,请返回该记录。这将涉及一些函数来

  • 我在谷歌周围看了一段时间,但没有工作。有谁能帮我解决这个问题吗?