javascript - 在哪里处理 MERN 堆栈上的数据?
问题描述
我正在构建一个基于 MERN Stack 的费用控制应用程序,我想知道哪种方式是处理数据的最佳方式。
更具体地说,我的费用数据具有以下模型
{
"_id" : ObjectId("5eceb10f0b59a200a545c39b"),
"date" : ISODate("2019-10-10T00:00:00.000Z"),
"description" : "INTERT BILL",
"credit" : "",
"debit" : "-100",
"category" : "HOME",
"subcategory" : "INTERNET",
"__v" : 0
}
如果我想在特定日期按类别对费用进行分组,最好的方法是什么?
在 mongodb 上处理它,通过聚合查询或获取特定日期范围内的所有费用并在发送到客户端之前在 node.js 上对其进行分组?
期望的输出:
{
HOME: {
total: '-300',
subcategories: [
{
internet: { total: -100}
},
{
water: { total: -200 }
}
]
}
}
解决方案
您应该让 MongoDB 进行分组,尤其是在处理大型数据集时。这样做的原因是您可能会通过长时间运行的操作来阻止事件循环。这是一个可以帮助您入门的聚合查询:
yourModel.aggregate([
{
$match: {
date: yourDateToMatch
}
},
{ // you need this conversion stage in order to be able to do maths with your debit field
$addFields: {
convertedDebit: {
$toDecimal: "$debit"
}
}
},
{
$group: {
_id: "$category",
total: {
$sum: "$convertedDebit"
},
// add grouping options for subcategories
}
}
])
并使用节点返回结果。
推荐阅读
- python-3.x - Python 3 如何在不显示命令行并在系统托盘中显示的情况下运行程序
- java - GCP:一个虚拟机可以在具有相同地址的不同网络上吗?
- r - 运行lda函数时不断出错
- python - Spark:将数据帧列表映射到函数的最佳策略
- angular - 如何从 Ionic 4 中的 ion-select-option 获取选择事件?
- docker - Cloud Build 如何采用动态参数来增加注册表标记?
- python - 错误:‘float’对象没有属性‘isna’”
- swift - 你将如何在 Swift 的封闭范围内振荡值?
- sql - 是否有任何包可以在 Python 中提取特定关键字
- amazon-ec2 - AWS SSM 代理 cloudwatch 资源:内存事件吗?