使用多个where条件从Firebase数据库中选择

使用多个where条件从Firebase数据库中选择,firebase,firebase-realtime-database,angularfire2,Firebase,Firebase Realtime Database,Angularfire2,在Firebase数据库中,我有一个预订列表 每个预订如下结构 { userUid: string, status: string, moreStuff: { .... } } 我需要选择与具有特定状态(例如,status=confirmed)的特定用户(即,其userUid等于用户的uid,由应用程序知道)关联的所有预订 我可以使用以下查询选择属于特定用户的预订 db.list('bookings', { query: {

在Firebase数据库中,我有一个预订列表

每个预订如下结构

{
   userUid: string,
   status: string,
   moreStuff: {
     ....
   }
}
我需要选择与具有特定状态(例如,
status=confirmed
)的特定用户(即,其userUid等于用户的uid,由应用程序知道)关联的所有预订

我可以使用以下查询选择属于特定用户的预订

db.list('bookings', {
        query: {
            orderByChild: 'userUid',
            equalTo: user.uid
        }
    })

但我不知道是否可以添加额外的选择条件,例如,在firebase查询中,您不能在多个字段上进行筛选。我曾多次遇到这种限制

我认为,如果您对数据进行不同的建模,您的挑战将变得更容易。我相信用户和预订之间存在一对多的关系。也就是说,一个用户可能有多个预订,但一个预订可能只有一个用户。如果是这种情况,我将创建一个顶级节点“BookingList”,其中包含每个用户的单独预订列表。结构如下图所示。路径“bookingList/”包含给定用户的预订列表。如果知道用户ID,可以访问该列表。它将包含该用户的所有预订。然后,您可以查询每个预订中的单个字段以进行筛选

bookingLists
  <userId>
     bookings
        <bookingKey>
            status
            ...other fields
预订列表
预订
地位
……其他领域

如果您需要进一步过滤预订,您可以在客户端使用可观察操作映射和过滤器进行过滤。只要每个用户没有太大的预订列表,这将可以扩展

Firebase数据库查询只能对单个属性进行排序/筛选。您可以将要筛选的值组合到单个属性中。看见或者,您可以对数据建模以允许查询。例如,乍一看,这似乎是一个分类问题,我在这里讨论过:谢谢。清楚的不过还有一个问题。在中到复杂的应用程序中使用Firebase时,过滤器的一个字段的限制不是很大吗?在我的情况下,您建议的解决方案有效,但如果我更改标准(例如,我希望某个月的“待定”预订),我将不得不在客户端进行筛选(如您所建议的)。是的,这是一个很大的限制。但也有一些变通方法,比如合并字段或客户端过滤。但还是很不方便。但据Firebase团队称,这是实现真正规模化的必要条件。在我的例子中,我使用Firebase并不是因为它的可伸缩性,而是因为它的实时性和它的无服务器模型。我发现我可以忍受这些限制。