使用Vertx mongodb客户端流畅与内联和嵌套

时间:2016-05-09 15:40:41

标签: java mongodb vert.x

仔细阅读文档,我仍然感到困惑的是以流利的方式使用mongoClient的优势(如果有的话)。任何人都可以向我解释,如果它能保证秩序;

在线排行 - 两者都会同时运行,没有任何保证。

mongoClient.runCommand("aggregate", getSomeCommand1(), res -> {});
mongoClient.runCommand("aggregate", getSomeCommand2(), res -> {});

运行嵌套 - getSomeCommand1将在getSomeCommand2之前首先运行完毕。

mongoClient.runCommand("aggregate", getSomeCommand1(), res1 -> {
       mongoClient.runCommand("aggregate", getSomeCommand2(), res2 -> {});
});

以流畅的方式运行 - 与在线运行相同吗?

mongoClient.runCommand("aggregate", getSomeCommand1(), res -> {}).mongoClient.runCommand("aggregate", getSomeCommand2(), res -> {});

2 个答案:

答案 0 :(得分:1)

远非一个完整的答案,但运行一些基本测试表明以流畅的方式运行与在线运行相同;

我在大型数据集上运行了一个慢命令(聚合)和一个快速命令(计数)。

mongoClient.runCommand("aggregate", getTotalRecsPerTypeCommand(sellerId, collection), res -> {
    result.put("totalRecsPerType", res.result());
}).count(collection, new JsonObject().put("sellerId", sellerId), res -> {
    result.put("totalRecs", res.result());
    requestMessage.reply(result);
});

最初只返回总数,但是当回复从fast命令移动到slow命令时,则返回两个结果。这表明它们都是在同一时间运行而没有订单的保证。

    mongoClient.runCommand("aggregate", getTotalRecsPerTypeCommand(sellerId, collection), res -> {
        result.put("totalRecsPerType", res.result());
        requestMessage.reply(result);
    }).count(collection, new JsonObject().put("sellerId", sellerId), res -> {
        result.put("totalRecs", res.result());
    });

答案 1 :(得分:0)

在线运行保证执行的顺序,即可能在没有负载很重的机器上多次运行第一个代码将保留顺序。

同样的事情是使用流畅的API。在这种情况下,它只能帮助您省略分号。如果要创建 flow ,在第一个命令结束后将触发下一个命令,请使用RxJava(或嵌套的情况,但从长远来看,您最终可能会使用{{3} })。

看看这里:callback hell 虽然我不是本课程中使用ObservableFuture的忠实粉丝(我建议使用https://github.com/vert-x3/vertx-mongo-client/blob/master/vertx-mongo-service/src/main/generated/io/vertx/rxjava/ext/mongo/MongoService.java),但这是一个很好的起点。