使用Java MongoDb驱动程序的Bson漂亮打印

时间:2017-08-31 09:14:34

标签: java mongodb bson mongo-java mongo-java-driver

我使用的是Mongo Aggregation Framework,使用的是Java MongoDB驱动程序3.3版。我有一个聚合管道,它只是类型List<Bson>的集合。我正试图找到一种方法来打印管道的每个阶段。

在每个元素上调用toString方法是不够的,因为每个阶段都是Bson接口的简单实现的实例,即SimplePipelineStage。这个愚蠢的类没有覆盖toString方法。

使用mongo java driver Aggregates类的工厂方法创建管道,如下所示:

Aggregates.match(/* ... */)
Aggregates.project(/* ... */)
// And so on...

可以找到Javadoc here

我怎样才能打印出这样的物体?我确信类型BasicDbObject具有智能toString实现,但我找不到从Bson转换为BasicDbObject的方法。

提前多多感谢。

4 个答案:

答案 0 :(得分:4)

谷歌搜索更加困难,我找到了一个漂亮打印Bson实例的解决方案。诀窍是将其转换为BsonDocument的实例,该实例具有toString方法的实现,该方法返回相应JSON的字符串表示。

Bson bson = Filters.gt("a", 10);
BsonDocument bsonDocument = bson.toBsonDocument(BsonDocument.class, MongoClient.DEFAULT_CODEC_REGISTRY);
System.out.println(bsonDocument);

原始链接如下:Converting Bson object to BsonDocument

答案 1 :(得分:1)

使用 mongo 4 驱动程序,它看起来像这样:

    private String pretty(Document document) {
        var settings = JsonWriterSettings.builder()
                .indent(true)
                .outputMode(JsonMode.SHELL)
                .build();
        return document.toJson(settings);
    }

答案 2 :(得分:0)

对于mongodb-java API 3.4,常量MongoClient.DEFAULT_CODEC_REGISTRY不能直接访问,它是私有成员。有一个静态方法CodecRegistry getDefaultCodecRegistry(),它返回相同的常量。

另一点,BsonDocument.toString()在内部执行toJson()默认JsonWriterSettings。为了查看Shell等效的Query,请使用如下所示:

public void logQuery(Bson filter) {
    if (LOGGER.isDebugEnabled()) {

        LOGGER.debug(
                "filter query: " + filter.toBsonDocument(BsonDocument.class, MongoClient.getDefaultCodecRegistry())
                        .toJson(new JsonWriterSettings(JsonMode.SHELL)));
    }
}

答案 3 :(得分:0)

这是一个比较老的问题,但是我在这里提出了我的建议(针对mongodb-driver 3.6.4),因为这是在“ mongodb java driver pretty print”上进行搜索时最相关的帖子:

BsonDocument bsonDocument = bson.toBsonDocument(BsonDocument.class, MongoClient.getDefaultCodecRegistry());
JsonWriterSettings.Builder settingsBuilder = JsonWriterSettings.builder().indent(true);
System.out.println(bsonDocument.toJson(settingsBuilder.build());