Bson pretty print using Java MongoDb 驱动程序

Bson pretty print using Java MongoDb driver

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

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

管道是使用 mongo java 驱动程序 Aggregates class 的工厂方法创建的,如下所示:

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

Java可以找到文档 here.

如何漂亮地打印这些对象?我确定 BasicDbObject 类型有一个智能的 toString 实现,但我找不到从 Bson 转换为 BasicDbObject.

的方法

非常感谢。

谷歌搜索有点困难,我找到了一个漂亮打印 Bson 实例的解决方案。诀窍是将其转换为 BsonDocument 的实例,该实例具有 toString 方法的实现,即 returns 对应 JSON.[=15= 的字符串表示形式]

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

原文link如下:Converting Bson object to BsonDocument.

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

还有一点,BsonDocument.toString() 在内部做了一个 toJson(),默认为 JsonWriterSettings。为了查看 Query 的 Shell 等价物,请像下面这样使用它:

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

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

这是一个相当古老的问题,但是我在这里提出了我的建议(对于 mongodb-驱动程序 3.6.4),因为这是在谷歌搜索 "mongodb java driver pretty print" 时最相关的 post :

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

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

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