我有一个Firestore数据库,它有一些文档,其中包括“ position”字段。 此“职位”字段可以使用值“高级讲师”,“部门主管”,“讲师”。
我要对该集合进行排序,以使包含“部门负责人”作为职位的文档排在最前面,包含“高级讲师”作为职位的文档应排在最后面,而包含“讲师”的文档应排在最前面。该位置应该位于最底端。
我不能只是按字母顺序排序。 (“ H”,“ S”,“ L”)
如何在Firestore中做到这一点?
答案 0 :(得分:3)
一种解决方案是创建一个额外的字段,专用于您的特定排序,例如positionSorting
。
在NoSQL数据库世界中,您应该毫不犹豫地添加新字段以简化查询(或使其成为可能)。
例如,如果您保存带有1
作为位置值的文档,则该字段的值为Head of department
,如果它是2
,则该字段的值为Senior lecturer
,依此类推
然后您只需按以下方式查询您的收藏集:
users.orderBy("positionSorting").get()
.then(function(querySnapshot) {
querySnapshot.forEach(function(doc) {
console.log(doc.id, " => ", doc.data());
});
});
答案 1 :(得分:3)
如果Renaud的方法(使用排序顺序添加显式字段)在您的用例中不起作用,那么我通常会以排序顺序为现有position
字段值添加前缀。这样它们就变成了:
"1 - Head of department"
"2 - Senior Lecturer"
"3 - Lecturer"
这样,您可以只需对position
字段进行排序,并以正确的顺序获取它们。如果您不想向用户显示这些数字前缀,则可以将其隐藏在用户界面代码中。
由杰伊编辑
上面唯一的潜在问题是是否增加了更多职位,例如,职位 10-助理的助手将排在 1-部门主管之后。如果您只有10个职位级别(0-9),这不是问题
您可以通过填充位置以使它们都具有相同的数字位数来解决此问题;
001 - Head of Dept
002 - Senior Lecturer
.
.
.
010 - Assistant's Assistant