Firebase - 如何编写多个orderByChild来提取数据?
我正在寻找数据,其中2个字段与我传入的字段相同.
这是我的代码示例:
this.refApp .orderByChild('userUid') .startAt(uid).endAt(uid) .orderByChild('jobId') .startAt(jobId).endAt(jobId) .on('value', (snap) => { //This currently doesn't get returned. });
在上面的例子中,我没有得到任何编译器错误,代码似乎很好.但是,我对数据进行了硬编码,以便返回uid和jobid等于的对象.
我可以让这个为一个orderByChild工作但是当我像上面那样做两个时它似乎什么都不做.
我正在使用typescript,angular2和firebase.
有任何想法吗?
您只能使用一种订购方法.
要查询更多信息,您需要重新考虑数据结构.您当前的结构可能看起来像这样:
{ "key": { "id_1": { "userUid": "user_1", "jobId": "job_1" }, "id_2": { "userUid": "user_1", "jobId": "job_2" }, "id_3": { "userUid": "user_2", "jobId": "job_3" } } }
使用此结构,您只能使用一个子键索引.
现在考虑这个结构:
{ "key": { "user_1": { "id_1": { "jobId": "job_1", "userUid": "user_1" }, "id_2": { "jobId": "job_2", "userUid": "user_1" } } "user_2": { "id_3": { "jobId": "job_3", "userUid": "user_2" } } } }
此结构显式创建索引uid
.所以现在如果你想通过用户获得所有工作,你可以编写这个查询:
var ref = new Firebase(''); var uid = 'user_1'; var userRef = ref.child('key').child(uid); var query = userRef.orderByChild('jobId'); query.on('value', (snap) => console.log(snap.val());
orderByChild
在Firebase中进行多种计算的另一种方法是创建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')
这也适用于startAt
和endAt
,如果你想查询所有的雪出生在一个范围之久。首先创建密钥:
{ userId: { firstName: 'Snow', lastName: 'Jon', birthYear: 283, orderNameYear: 'Snow283' } }
这样就可以查询: userRef.orderByChild('orderNameYear').startAt('Snow280').endAt('Snow285')
这将返回出生在280和285之间的所有Snow。