【问题标题】:Return sorted fields from single Firestore document从单个 Firestore 文档返回排序字段
【发布时间】:2018-02-08 07:04:46
【问题描述】:

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 中可能不是什么大问题。

【问题讨论】:

    标签: javascript google-cloud-firestore


    【解决方案1】:

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

    例如

    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);

    【讨论】:

      【解决方案2】:

      orderBy 对文档进行排序,而不是文档中的字段。在您的示例中,您获取了一份文档。您有两种选择:

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

      【讨论】:

        猜你喜欢
        • 2021-09-28
        • 2019-11-03
        • 2020-04-19
        • 2019-02-26
        • 2020-12-05
        • 2021-07-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多