gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 05:52:05 25 4
gpt4 key购买 nike

我在 firebase 中有这样的数据:

"application": {
"companies": {
"firebase": {
"creation": {
"name": "Firebase Inc",
"location": "USA"
},

"google": {
"creattion": {
"name": "Google Inc",
"location": "USA"
}
}

"facebook": {
},

"apple": {
}
}
}
}

companies 键下有数万条记录。我如何有效地执行以下查询?

如何只查询其名称下存在键 creation 的记录?

如何只查询名称下没有键 creation 的记录?

我还想对返回的结果集调用 .on('child_added'),这样我以后就可以只处理那些特定的记录。可能吗?

最佳答案

编辑:不使用额外参数的更简单方法

查询

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

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

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

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

工厂

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

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() .



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

(留作引用)

另一种方法是将另一个名为 hasCreation 的参数添加到具有 creationcompanies 的子项中,并通过它进行查询。

数据

  • 查询将是 var ref = new Firebase(fbUrl+'/companies').orderByChild("hasCreation").equalTo(hasCreation);
    • 如果查询中的 hasCreationnull,则查询将返回没有 hasCreation child 的公司。
    • 如果查询中的hasCreationtrue,则查询将返回hasCreation===true的公司。
{
"company1" : {
"creation" : {
"name" : "company1"
},
"hasCreation" : true
},
"company2" : {
"name" : "company2"
},
"company3" : {
"name" : "company3"
},
"company4" : {
"creation" : {
"name" : "company4"
},
"hasCreation" : true
}
}

规则

您可以像这样将 ".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;
}
});

Controller

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>

关于javascript - Firebase:如何从存在特定键的数据中检索记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29179389/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com