我希望存储一些 child 事件的数据,其中每个事件都适合特定年龄范围。假设 A 幕适合 2 - 5 岁的 child 。行为 B 适合 0 -1 岁。
在客户端,有一组固定的选择,例如:
0 - 1 年,
13年,
4 - 5 年,
6 - 13 岁
现在的要求是事件 A 应该出现在选择 1 - 3 和 4 -5 年中,因为 2 - 5 与这两个范围重叠。
存储事件数据然后有效地查询它的好方法是什么?
最佳答案
假设固定的选择集是您的应用程序的永久功能,我将为每个匹配项设置一个 bool 字段,例如,您的事件将如下所示:
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,它可能更适合您的需求(我个人认为我通常会推荐 firestore大多数用例都在 RTDB 上)。如果您坚持使用 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 并获取您的事件列表。如果您正在寻找一系列年龄,这将意味着多个查询,并且确实意味着必须确保您的查找块保持同步。如果应用程序数据结构的其余部分不太复杂,这应该没问题。
关于firebase 实时数据库查询以查找数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64312088/