【问题标题】:How to get result from multiple query on multiple collection of mongo in eventBus vertx2?如何从eventBus vertx 2中多个mongodb集合的多个查询中获取结果?
【发布时间】:2015-08-24 10:39:46
【问题描述】:

我正在提供 API,我正在按月将数据存储在数据库中,并按日期在 mongodb 上存储数据。

所以我有 db db_08_2015 然后我有 31 个集合,从 date_01date_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 只是为了存储原始数据。

标签: java mongodb vert.x


【解决方案1】:

我认为在您的情况下,采用不同的方法对数据进行建模可能会更好。 在分析方面,我会推荐如下引用的 lambda 架构方法:

  • 所有进入系统的数据都分派到批处理层和速度层进行处理。
  • 批处理层有两个功能:(i) 管理主数据集(不可变的、仅附加的原始数据集),以及 (ii) 预计算 批处理视图。
  • 服务层为批处理视图编制索引,以便以低延迟、即席的方式查询它们。
  • 速度层补偿服务层更新的高延迟并仅处理最近的数据。
  • 可以通过合并批处理视图和实时视图的结果来回答任何传入的查询。

考虑到上述情况,为什么不使用聚合集合来保存查询所需格式的聚合数据,同时以您描述的格式保存原始副本。

通过这样,您将可以查看所需查询格式的数据,并在系统适得其反的情况下重新创建聚合数据。

图表和报价参考 - Lambda Architecture

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-09
    • 2013-11-03
    相关资源
    最近更新 更多