【发布时间】:2015-08-24 10:39:46
【问题描述】:
我正在提供 API,我正在按月将数据存储在数据库中,并按日期在 mongodb 上存储数据。
所以我有 db db_08_2015 然后我有 31 个集合,从 date_01 到 date_31
我必须查询从日期 1 到日期 10 的数据才能获得总支出,所以我需要像这样发送 31 个请求。
我的问题是如何在我返回客户端之前通过 1 个请求获取数据以获取总和,例如将请求同步到 mongo 以获取结果。 像我有 date_01 = 10 然后 date_02 = 20 ......我想在返回给客户之前把它全部加起来。
vertx.eventBus().send("mongodb-persistor", json, new Handler<Message<JsonObject>>() {
@Override
public void handle(Message<JsonObject> message) {
logger.info(message.body());
JsonObject result = new JsonObject(message.body().encodePrettily());
JsonArray r = result.getArray("results");
if (r.isArray()) {
if (r.size() > 0) {
String out = r.get(0).toString();
req.response().end(out);
} else {
req.response().end("{}");
}
} else {
req.response().end(message.body().encodePrettily());
}
}
});
【问题讨论】:
-
好吧,您已经说了很多要了解自己的全部内容。您的集合是独立的,因此您需要编写逻辑代码以将自己聚合到 API 中,而不是由数据库完成所有工作。这意味着对数据库的多次调用。我很难看到这是一个好的设计,甚至是规模化所必需的案例。实际上,这就是为什么存在诸如“分片”之类的解决方案以允许分布式负载的原因。即使只有一个系列。
-
@BlakesSeven 感谢您的推荐,但就我而言,数据很多,我必须将它们分开。
-
你不会是唯一一个这样做的人。重点很简单。特别是 MongoDB 一次只能处理一个集合,因此从您想要执行的聚合中排除任何“数据库帮助”。如果您想要最高效的数据库端,那么使用单一集合并查看其他方式进行扩展。否则,这完全取决于您的代码来检索和聚合读取的原始数据,以及多次读取。这里的聚合是一个简单的概念。就像 HashMap 并不断累积匹配键上的数据。但是您仍然需要提出许多请求。
-
@BlakesSeven 非常感谢我理解你的想法。我的想法是完全错误的,我们需要一个集合来存储要查询的聚合结果,而 db_month coll_day 只是为了存储原始数据。