Firebase - 如何编写多个orderByChild来提取数据?
我正在寻找数据,其中2个字段与我传入的字段相同。
以下是我的代码示例:
this.refApp
.orderByChild('userUid')
.startAt(uid).endAt(uid)
.orderByChild('jobId')
.startAt(jobId).endAt(jobId)
.on('value', (snap) => {
//This currently doesnt get returned.
});
在上面的例子中,我没有得到任何编译器错误,代码似乎很好。 但是,我对数据进行了硬编码,以便返回uid和jobid等于的对象。
我可以让这个为一个orderByChild工作但是当我像上面那样做两个时它似乎什么也没做。
我正在使用typescript,angular2和firebase。
有什么想法吗?
答案 0 :(得分:6)
在Firebase中执行多种orderByChild
的另一种方法是创建orderKey。
想象一下,您的基地里有这个
{
userId: {
firstName: 'Snow',
lastName: 'Jon',
birthYear: 283
}
}
您要查询:userRef.orderByChild('firstName').equalTo('Jon').orderByChild('lastName').equalTo('Snow')
您需要像这样在用户上创建密钥:
{
userId: {
firstName: 'Snow',
lastName: 'Jon',
birthYear: 283,
orderName: 'JonSnow'
}
}
因此您可以这样查询:userRef.orderByChild('orderName').equalTo('JonSnow')
如果您要查询几年内出生的所有Snow,这也适用于startAt
和endAt
。您首先创建密钥:
{
userId: {
firstName: 'Snow',
lastName: 'Jon',
birthYear: 283,
orderNameYear: 'Snow283'
}
}
因此您可以查询:userRef.orderByChild('orderNameYear').startAt('Snow280').endAt('Snow285')
这将返回出生在280和285之间的所有Snow。
答案 1 :(得分:0)
不支持。
根据您需要在实体上运行的查询类型,您必须按用户存储作业,例如@ david-east建议,或者添加一个组合这两个属性的属性:
{
jobId: 'J123',
userId: 'provider:123',
jobIdUserIdIndex: 'J123/provider:12345',
[...]
}
但通常情况下,无法允许您需要的所有查询。您要么必须在客户端过滤对象,要么复制数据以创建不同的数据视图;您将在/jobs/$jobId
,/users/$userId/jobs/$jobId
和/pendingJobs/$jobId
保存作业数据。
我发现将orderBy *方法仅用于排序实体和复制数据以选择它们的子集更容易。
我希望Firebase支持组合多个属性的索引,但是现在你需要自己构建这些索引。但是,具有不同的视图允许对它们应用不同的安全规则:例如,只有一位用户才能访问/users/$userId/jobs/
,只有管理员才能访问/jobs/$jobId
。