【问题标题】:Firestore Group by fieldFirestore 按字段分组
【发布时间】:2020-01-09 21:52:57
【问题描述】:

下面是我的firestore集合结构

我的vue获取数据的方法

fetchResults(){
  db.collection('data').onSnapshot((querySnapShot)=>{
    let results = [];
    querySnapShot.forEach(doc=>{
      results.push(doc.data())
    })
    this.record=results;
  })
}

我想要的是像group by ID and order by sec_id desc这样的文档中查询。

我应该如何进行这样的查询?

这样我就会得到按 ID 字段分组的文档。

【问题讨论】:

  • db.collection('data').orderBy('id').orderBy('sec_id', desc) 不工作?
  • @ConstantinBeer 结果应该是唯一的 ID 行,在我的情况下将被分组
  • 也许这个视频对youtube.com/watch?v=Ofux_4c94FI有帮助

标签: firebase vue.js google-cloud-firestore vuetify.js


【解决方案1】:

作为 NoSQL 类型的数据库,Cloud Firestore 不提供任何聚合查询,例如分组、求和、最大值等。您必须在客户端代码中执行这些操作。对于您的情况,这意味着您必须查询集合中的所有文档,然后按您想要的任何字段对它们进行分组。或者,您可以维护预先分组的文档的单独集合以满足您的查询。 (像这样的复制数据在 NoSQL 类型的数据库中很常见。)

【讨论】:

  • 哦不知道 - 像这样复制数据在 NoSQL 类型的数据库中很常见。还有一个疑问 - you have to perform these operations in your client code - 如果它向客户端代码返回大量数据而不进行分组会发生什么。客户端内存消耗不是很大吗
  • 你需要足够的内存来存储内存中的所有文档,是的。
【解决方案2】:

你可以使用

fetchResults(){
  db.collection('data')
 .orderBy("id", "asc")
 .onSnapshot((querySnapShot)=>{
     // Do something
  })
}

更多信息请访问https://firebase.google.com/docs/firestore/query-data/order-limit-data,您也可以通过点击过滤器图标

来应用过滤器

【讨论】:

    【解决方案3】:

    不应使用聚合查询来计算数据,而是应使用客户端逻辑将数据保存在文档本身中,以便在每次文档更改或使用云功能时更新聚合数据。

    查看来自 Google 博客的这篇文章。

    https://firebase.google.com/docs/firestore/solutions/aggregation

    【讨论】:

      【解决方案4】:

      我来晚了,但是如果有人在寻找更简单的解决方案,我建议您使用 lodash 进行分组,在下面的示例中,我根据订单日期对销售额进行分组。

      import { mapValues, groupBy, omit } from "lodash";
      
      export const salesTrend = async () => {
          const orderData: any[] = [];
          const orderResponse = await getDocs(collectionRef);
          const orders = orderResponse.docs
          orders.forEach(order => orderData.push(order.data()))
          let grouped = mapValues(groupBy(orderData, 'orderDate'),
              clist => clist.map(car => omit(car, 'orderDate'))
          );
          console.log(grouped);
      }
      

      【讨论】:

        猜你喜欢
        • 2021-01-27
        • 2021-05-27
        • 2016-09-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多