我相信您将文档 ID 称为“名称”是在混淆术语。
如果您的数据如下所示:
{
"names": { // Collection
"Tom": { age: 42, country: "US" }, // Document
"sally": { age: 38, country: "AU" }, // Document
"richard": { age: 36, country: "UK" }, // Document
/* ... */
}
}
"tom"、"richard" 和 "sally" 是文档 ID,而不是名称。要使用lexicographic 顺序(计算机和 Firestore 在二进制级别上理解的顺序)对这些“名称”进行排序,您可以使用:
val db = Firebase.firestore
db.collection("names")
.orderBy(FieldPath.documentId())
.get()
.addOnSuccessListener { documents ->
Log.d(TAG, "Found ${documents.size()} documents")
for (document in documents) {
Log.d(TAG, "> ${documents.getReference().getPath()}")
}
}
.addOnFailureListener { exception ->
Log.w(TAG, "Error getting documents: ", exception)
}
上述查询将返回/names/Tom,然后是/names/richard,然后是/names/sally。
这是因为字典顺序与字母顺序不同。
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" // lexicographic order
"AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz" // alphabetical order
由于 Firebase 要求查询一次通过索引,除非您的文档 ID 都遵循相同的大小写样式,否则您将获得与预期不同的结果。为了克服这个问题,在允许您对文档 ID 使用任何大小写的同时,您应该在文档数据中存储一个新字段,其中包含文档的小写 ID。
{
"names": { // Collection
"Tom": { age: 42, country: "US", sortName: "tom" }, // Document
"sally": { age: 38, country: "AU", sortName: "sally" }, // Document
"richard": { age: 36, country: "UK", sortName: "richard" }, // Document
/* ... */
}
}
使用上面的数据,下面的查询现在将返回/names/richard,然后是/names/sally,然后是/names/Tom:
val db = Firebase.firestore
db.collection("names")
.orderBy("sortName", Query.Direction.ASCENDING)
.get()
.addOnSuccessListener { documents ->
Log.d(TAG, "Found ${documents.size()} documents")
for (document in documents) {
Log.d(TAG, "> ${documents.getReference().getPath()}")
}
}
.addOnFailureListener { exception ->
Log.w(TAG, "Error getting documents: ", exception)
}