从单个Firestore文档返回已排序的字段

时间:2018-02-08 07:04:47

标签: javascript google-cloud-firestore

Firestore允许您在查询集合时对文档进行排序(例如,citiesRef.orderBy("name")):https://firebase.google.com/docs/firestore/query-data/order-limit-data

但是,有没有办法对文档的字段进行排序?

例如,我在Firestore中有以下数据模型:

exampleCollection: {
    documentId: {
        field1: {sortOnMe: 1, foo: bar},
        field2: {sortOnMe: 2, foo: bar},
        field3: {sortOnMe: 3, foo: bar}
    }
}

我目前正在返回给定文档中的所有字段,如下所示:

exampleCollection.doc(documentId)
                 .valueChanges()
                 .subscribe((response) => { 
                     // response = {
                     //     field2: {sortOnMe: 2, foo: bar},
                     //     field3: {sortOnMe: 3, foo: bar},
                     //     field1: {sortOnMe: 1, foo: bar}
                     // }
                  });

这很好用,并且对变化做出反应。但是,exampleData不可预测的顺序,并且可以在添加新字段时更改。有没有办法根据上面的查询中的某些嵌套字段来排序上面查询返回的字段,例如sortOnMe

如果没有,是否最好在每个文档中添加一个可以进行排序的集合?来自Firebase我对犹豫不决太过深了,但这在Firestore中可能不是什么大问题。

2 个答案:

答案 0 :(得分:2)

orderBy命令文档,而不是文档中的字段。在您的示例中,您已获取一个文档。你有几个选择:

  1. 获取文档并订购客户端中的字段
  2. 创建子集合并获取子集合中的所有文档,按您字段中的值排序。

答案 1 :(得分:0)

文档中的数据是JSON。无法控制JSON对象中的字段顺序。您必须在JavaScript代码中订购它。

E.g。



var json = {
     field2: {sortOnMe: 2, foo: 'bar'},
     field3: {sortOnMe: 3, foo: 'bar'},
     field1: {sortOnMe: 1, foo: 'bar'}
};

var keys = Object.keys(json);
keys.sort((a,b) => json[a].sortOnMe - json[b].sortOnMe);

var sorted = keys.map(key => json[key]);

console.log(sorted);