Firestore 按字段分组

问题描述 投票:0回答:4

下面是我的 firestore 集合结构

enter image description here

我的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 字段分组的文档。

firebase vue.js google-cloud-firestore vuetify.js
4个回答
14
投票

截至 2022 年 10 月,您可以使用计数、总和和最大值进行聚合查询


原答案:

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


2
投票
您可以使用

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

更多信息请访问

https://firebase.google.com/docs/firestore/query-data/order-limit-data,您还可以通过点击过滤器图标enter image description here来应用过滤器


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

请参阅 Google 博客上的这篇文章。

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


0
投票
我太晚了,但如果有人寻找更简单的解决方案,我建议您使用 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); }
    
© www.soinside.com 2019 - 2024. All rights reserved.