【发布时间】:2017-06-25 21:39:09
【问题描述】:
我编写了一个从 MongoDB 数据库中检索数据的 API。 我还有一个前端应用程序,它使用来自 API 的数据(如果相关,两个应用程序都是使用 Koa 框架在 Node JS 中编写的)
我需要汇总给定时间段内需要计算的大量数值数据(平均、五分位数等),这可能是按月分组、按年分组或按 personID 分组的所有数据。
我读过一些例子,人们说 API 应该用作数据库层的包装器,只提供对原始数据的访问 - 但对我来说逻辑将存在于数据库上是有道理的(而不是而不是要求前端应用程序搅动数据)。
这是一个常见问题吗?根据您自己的经验 - 让 API 来做聚合还是前端应用程序更好?
示例文档
{
"date": ISODate("2016-07-31T07:34:05+01:00Z"),
"value": 5,
"personID": 123
},
{
"date": ISODate("2016-08-01T12:53:05+01:00Z"),
"value": 3,
"personID": 789
}
【问题讨论】:
-
API 不能是数据库的包装器。它应该包含您的所有用例和业务逻辑。如果您的数据必须聚合才能被使用,请在后端聚合它。可以在客户端计算机上计算快速计算且仅用于在前端视图中显示摘要的聚合。 API 的目标是为您的系统提供一个通用网关;客户端和子系统都必须经历相同的业务案例。这可确保您的系统的一致性和健全性。
-
感谢 @sturcotte06 - 用户向我的前端应用程序发出请求,然后它向 API 发出请求,这意味着我无法使用客户端计算机进行聚合。出于安全原因,我这样做了(因为我没有为所有用户提供唯一的 API 密钥,并且只有应用程序使用密钥)。只是为了检查我的理解是否正确 - 你是说 API 聚合数据以供前端应用程序使用数据是完全可以接受的吗?再次感谢。
-
是的,但这不应该是您的 API 的工作。您应该有一个在下班时间运行的聚合过程。它将处理当天的所有数据并将其推送到聚合数据集。然后,您的 API 将此聚合数据集作为资源提供。换句话说,您的 API 负责为业务案例提供服务并应用业务规则。它不应该负责批处理,因为这是一个耗时的过程,并且不能很好地适应快速增长的数据集。但是,处理这些数据是您的后端的责任。
-
谢谢@sturcotte06 - 这真的很有帮助。我唯一担心的是我的数据全天频繁更新,需要实时查看(除非我的刷新率是每'n'分钟一次)。我在想我可以利用 MongoDB 的聚合函数——当然是应用适当的索引,但我在读完这篇文章后现在正在重新考虑这一点。真的很有帮助,再次感谢您。
-
这真的取决于你的聚合范围。聚合过程可以每 5 分钟运行一次。唯一的问题是该过程是否需要超过 5 分钟。祝你好运!
标签: node.js mongodb aggregation-framework