Firebase - 如何编写多个orderByChild来提取数据?

时间:2015-12-19 20:01:10

标签: javascript angularjs firebase angular firebase-security

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。

有什么想法吗?

2 个答案:

答案 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,这也适用于startAtendAt。您首先创建密钥:

{
    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