编辑:更简单的方法,无需使用额外的参数
Queries
以下是无需使用额外参数即可执行此操作的查询:
- Find the companies without
creation
:
var ref = new Firebase(fbUrl+'/companies').orderByChild("creation").equalTo(null);
- Find the companies with
creation
:
var ref = new Firebase(fbUrl+'/companies').orderByChild("creation").startAt(!null);
- 你会添加
".indexOn": "creation"
遵守规则。
Edit 2:我很好奇,所以我推送了 11,000 条记录到/companies2
(一半与creation
儿童,一半没有)。使用上述查询(或下面显示的变体之一),我能够在大约 4 秒内检索 5500 条匹配记录。
Edit 3:如果您经常运行这些查询,则将子查询分开可能是值得的/companies
根据存在的情况分为两个垃圾箱creation
。这样,您就可以分别读取这两个段,而无需依赖查询。
Factory
这是修改后的工厂的样子(我已经修改了PLNKR http://plnkr.co/edit/BfOXgF73s46AWTUHvXh6?p=preview匹配):
app.factory("CompaniesFactory",function($q, fbUrl){
return function(hasCreation){
var deferred = $q.defer();
var ref = new Firebase(fbUrl+'/companies').orderByChild("creation");
var query;
if (hasCreation) {
query = ref.startAt(!null);
// or:
// query = ref.startAt(true);
} else {
query = ref.equalTo(null);
// or:
// query = ref.endAt(!null);
// query = ref.endAt(true);
}
query.once("value", function(dataSnapshot){
deferred.resolve(dataSnapshot.val());
}, function (error) {
deferred.reject(error);
});
return deferred.promise;
}
});
是的,可以打电话.on('child_added')
在返回的 dataSnapshot 上。看数据快照.ref() https://www.firebase.com/docs/web/api/datasnapshot/ref.html.
使用额外参数的原始答案:
(保留此以供参考)
另一种方法是添加另一个名为hasCreation
给孩子们companies
具有creation
,并以此查询。
Data
- The query would then be
var ref = new Firebase(fbUrl+'/companies').orderByChild("hasCreation").equalTo(hasCreation);
- If
hasCreation
在查询中是null
,查询将返回没有的公司hasCreation
child.
- If
hasCreation
在查询中是true
,查询将返回具有hasCreation===true
.
{
"company1" : {
"creation" : {
"name" : "company1"
},
"hasCreation" : true
},
"company2" : {
"name" : "company2"
},
"company3" : {
"name" : "company3"
},
"company4" : {
"creation" : {
"name" : "company4"
},
"hasCreation" : true
}
}
Rules
你会添加".indexOn" : "hasCreation"
按照你的规则,如下所示:
"so:29179389":{
".read" : true,
".write" : true,
"companies" : {
".indexOn" : "hasCreation"
}
}
公司工厂
app.factory("CompaniesFactory",function($q, fbUrl){
return function(hasCreation){
var deferred = $q.defer();
if (!hasCreation) {
hasCreation = null;
}
var ref = new Firebase(fbUrl+'/companies').orderByChild("hasCreation").equalTo(hasCreation);
ref.once("value", function(dataSnapshot){
deferred.resolve(dataSnapshot.val());
});
return deferred.promise;
}
});
控制器
app.controller('HomeController',function($scope,fbUrl,CompaniesFactory) {
$scope.getCompanies = function(hasCreation) {
var companies = new CompaniesFactory(hasCreation).then(function(data){
console.log(data);
$scope.companies = data;
});
}
});
HTML
<body ng-app="sampleApp">
<div ng-controller="HomeController">
<button ng-click="getCompanies(true)">Find with creation</button>
<button ng-click="getCompanies(false)">Find without creation</button>
<h2>Companies:</h2>
{{companies}}
</div>
</body>