Firebase实时数据库查询以查找数据

时间:2020-10-12 05:20:25

标签: firebase firebase-realtime-database

我希望存储一些儿童活动的数据,其中每项活动都适合特定的年龄范围。假设行为A对2-5岁的孩子有好处。动作B适合0 -1岁。

在客户端,有一组固定的选择,例如: 0-1年 13年, 4-5年, 6-13岁

现在的要求是,活动A应该在选择1-3和4 -5年时出现,因为2-5重叠两个范围。

存储活动数据然后进行有效查询的好方法是什么?

2 个答案:

答案 0 :(得分:4)

假设固定的选择集是您应用程序的永久功能,那么我将为每个匹配项提供一个布尔值字段,例如,您的活动如下所示:

activities: {
  activityA: {
    range0to1: false,
    range2to3: true,
    range4to5: true,
    range6to13: false
  },
  activityB: {
    range0to1: true,
    range2to3: false,
    range4to5: false,
    range6to13: false
  }
}

然后,当您要查询所有适用于例如年龄在2到3岁之间,那么您已经可以查询字段了,没有什么太复杂了。

但实际上,为了长寿,我不认为固定的选择集在应用程序的生命周期内是永久的,在这种情况下,我宁愿拥有这样的东西:

activities: {
  activityA: {
    minAge: 2,
    maxAge: 5,
  },
  activityB: {
    minAge: 0,
    maxAge: 1,
  }
}

...然后,如果我要查询x和y之间年龄的固定选择,我的理想查询是针对minAge或maxAge在x和y之间的所有活动(因此范围内存在重叠) )

例如(伪代码)where ((minAge > x and minAge < y) or (maxAge > x or maxAge < y))

但是不幸的是,在实践中,firebase RTDB不允许您按多个字段进行查询,因此,如果还不算太晚,我建议您看一下可能更适合您需求的Firestore(我个人认为通常在大多数情况下,建议在RTDB上使用Firestore。

如果您对RTDB感到困惑,那么另一种解决方案可能是在结构的根目录下创建一个查找块:

{
  activities: {
    activityA: {
      // age range of 2-5 stored however you like
    },
    activityB: {
      // age range of 0-1 stored however you like
    },
    activityC: {
      // age range of 0-3 stored however you like
    }
  },
  ageActivityLookup: {
    age0: {
      activityB: true,
      activityC: true,
    },
    age1: {
      activityB: true,
      activityC: true,
    },
    age2: {
      activityA: true,
      activityC: true,
    },
    age3: {
      activityA: true,
      activityC: true,
    },
    age4: {
      activityA: true,
    },
    age5: {
      activityA: true,
    }
  }
}

因此,您可以简单地查询ageX并获取活动列表。如果您要查找一定范围的年龄,这将意味着多次查询,并且这确实意味着必须确保您的查询块保持同步。如果您的其余应用程序数据结构不太复杂,这应该可以。

答案 1 :(得分:0)

@hussein作为您想法的灵感,我对其进行了简化,以适应我的用例。我实际上没有在活动中添加每个年龄组分类,而没有单独的节点,例如:

baby:true 青少年:真实

以此类推。

随着活动的增加,这避免了维护和更新整个节点的开销,并且复杂性也不断增加