且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Firebase:如何从存在特定键的数据中检索记录?

更新时间:2023-02-22 23:13:02

更简单的方法,无需使用额外参数

查询

以下是无需使用额外参数即可执行此操作的查询:

  • 查找没有creation的公司:
    • var ref = new Firebase(fbUrl+'/companies').orderByChild("creation").equalTo(null);
  • 查找具有creation的公司:
    • var ref = new Firebase(fbUrl+'/companies').orderByChild("creation").startAt(!null);
  • 您可以将 ".indexOn": "creation" 添加到规则中.

编辑 2: 我很好奇,所以我将 11,000 条记录推送到 /companies2(一半有 creation 孩子,一半没有).我能够使用上述查询(或我在下面显示的变体之一)在大约 4 秒内检索到 5500 条匹配记录.

编辑 3:如果您经常运行这些查询,根据 的存在将 /companies 的子项分成两个 bin 可能是值得的创建.这样,您就可以分别读取这两个段,而无需依赖查询.

工厂

这是修改后的工厂的样子(我修改了 PLNKR匹配):

app.factory("CompaniesFactory",function($q, fbUrl){返回函数(hasCreation){var deferred = $q.defer();var ref = new Firebase(fbUrl+'/companies').orderByChild("creation");无功查询;如果(hasCreation){查询 = ref.startAt(!null);//或者://查询 = ref.startAt(true);} 别的 {查询 = ref.equalTo(null);//或者://查询 = ref.endAt(!null);//查询 = ref.endAt(true);}查询.一次(值",函数(数据快照){deferred.resolve(dataSnapshot.val());}, 函数(错误){deferred.reject(error);});返回 deferred.promise;}});

是的,可以在返回的 dataSnapshot 上调用 .on('child_added').请参阅 DataSnapshot.ref().


使用额外参数的原始答案:

(留作参考)

另一种方法是将另一个名为 hasCreation 的参数添加到具有 creationcompany 的子代,并通过该参数进行查询.

数据

  • 查询将是 var ref = new Firebase(fbUrl+'/companies').orderByChild("hasCreation").equalTo(hasCreation);
    • 如果查询中的 hasCreationnull,则查询将返回没有 hasCreation 子项的公司.
    • 如果查询中的 hasCreationtrue,则查询将返回具有 hasCreation===true 的公司.
{公司 1":{创造":{名称":公司1"},hasCreation":真},公司 2":{名称":公司 2"},公司 3":{名称":公司 3"},公司4":{创造":{名称":公司4"},hasCreation":真}}

规则

您可以将 ".indexOn" : "hasCreation" 添加到您的规则中,如下所示:

 "so:29179389":{.read":真的,.write":真的,公司":{".indexOn" : "hasCreation"}}

公司工厂

app.factory("CompaniesFactory",function($q, fbUrl){返回函数(hasCreation){var deferred = $q.defer();如果(!hasCreation){hasCreation = null;}var ref = new Firebase(fbUrl+'/companies').orderByChild("hasCreation").equalTo(hasCreation);ref.once(值",函数(数据快照){deferred.resolve(dataSnapshot.val());});返回 deferred.promise;}});

控制器

app.controller('HomeController',function($scope,fbUrl,CompaniesFactory) {$scope.getCompanies = 函数(hasCreation){var company = new CompaniesFactory(hasCreation).then(function(data){控制台日志(数据);$scope.companys = 数据;});}});

HTML

<div ng-controller="HomeController"><button ng-click="getCompanies(true)">使用创建查找</button><button ng-click="getCompanies(false)">查找而不创建</button><h2>公司:</h2>{{公司}}