如何按指定顺序获取Firebase关联数据?
自定义顺序返回Firebase对象的解决方案
首先直接给结论:Firebase的原生查询无法实现这种完全自定义的对象顺序(B→C→A),你需要在获取所有数据后进行本地排序——这不是你的操作失误,而是Firebase的查询模型特性决定的,确实不能把它当作传统关系型数据库来用。
为什么Firebase查询做不到?
Firebase的查询排序只能基于单个字段的升序/降序,或者匹配特定值的过滤,它没办法理解你想要的“先B,再C,最后A”这种和字段值无关的自定义顺序。你之前尝试的代码之所以不符合预期,是因为Firebase只能按照你设置的排序值字段来排序(比如升序会得到A(1)→C(2)→B(3),降序是B(3)→C(2)→A(1)),但这和你要的顺序刚好前两个对,但如果你的自定义顺序更复杂(比如B→A→C),原生查询就完全达不到了。
正确的解决方式:本地排序
获取所有关联对象后,在客户端用自定义规则排序。举个JavaScript的例子:
// 假设你从Firebase获取到的数据是这样的数组 const fetchedObjects = [ { id: 'objA', sortValue: 1 }, { id: 'objB', sortValue: 3 }, { id: 'objC', sortValue: 2 } ]; // 定义你想要的自定义顺序 const customOrder = ['objB', 'objC', 'objA']; // 按照自定义顺序排序 const sortedObjects = fetchedObjects.sort((a, b) => { return customOrder.indexOf(a.id) - customOrder.indexOf(b.id); }); // 现在sortedObjects就是你要的B→C→A顺序
关于Firebase的定位补充
你说的没错,Firebase不是关系型数据库,它的设计更偏向于实时、分布式的场景,擅长处理简单的排序、过滤和实时同步。如果你的自定义排序是固定不变的,也可以提前给每个对象加一个customSortRank字段(比如objB设为1,objC设为2,objA设为3),这样就能用orderBy('customSortRank')来直接查询出想要的顺序,但如果这个顺序经常变化,本地排序会更灵活。
内容的提问来源于stack exchange,提问作者Mike Miller
相关产品推荐
相关产品推荐

