使用Java MongoDb驱动程序进行Bson格式的漂亮打印

4
我正在使用Mongo Aggregation Framework和Java MongoDB驱动程序版本3.3。我有一个聚合管道,它仅是类型为List 的集合。我正在尝试找到一种方法来漂亮地打印每个管道阶段。
调用每个元素的toString方法是不够的,因为每个阶段都是Bson接口的简单实现SimplePipelineStage的实例。这个愚蠢的类没有任何覆盖toString方法的实现。
使用mongo java驱动程序Aggregates类的工厂方法创建了管道,如下所示:
Aggregates.match(/* ... */)
Aggregates.project(/* ... */)
// And so on...

Javadoc可以在这里找到。

我该如何漂亮地打印这些对象?我知道BasicDbObject类型具有智能的toString实现,但我找不到从Bson转换为BasicDbObject的方法。

非常感谢您的帮助。


.toJson()实际上是一个方法。 - Neil Lunn
toJsonBson 类型上未定义。请先阅读问题。 - riccardo.cardin
抱歉,我想到了“文档”,不过你真的应该使用它。我个人通过Gson来进行管道调试,以便找到某个代码块。 - Neil Lunn
我正在使用“聚合”工厂方法来创建每个管道。使用抽象的“Bson”并不是我的选择 :) - riccardo.cardin
没什么特别的,我更新了我的问题。谢谢。 - riccardo.cardin
显示剩余3条评论
4个回答

8

再仔细搜索一下,我找到了一个关于漂亮打印一个Bson实例的解决方案。诀窍是将它转换成一个BsonDocument实例,该实例有toString方法的实现,可以返回相应JSON的字符串表示。

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

原始链接如下:将Bson对象转换为BsonDocument


4

这是一个相对较旧的问题,然而我将我的建议(适用于mongodb-driver 3.6.4)放在这里,因为当通过Google搜索“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());

2
使用mongo 4驱动程序,代码大致如下:
    private String pretty(Document document) {
        var settings = JsonWriterSettings.builder()
                .indent(true)
                .outputMode(JsonMode.SHELL)
                .build();
        return document.toJson(settings);
    }

1
对于mongodb-java API 3.4来说,常量MongoClient.DEFAULT_CODEC_REGISTRY不再可以直接访问,它是一个私有成员。有一个静态方法CodecRegistry getDefaultCodecRegistry()返回相同的常量。
另一个要点,BsonDocument.toString()内部使用默认的JsonWriterSettings执行了toJson()。为了查看查询的Shell等效内容,请按以下方式使用:
public void logQuery(Bson filter) {
    if (LOGGER.isDebugEnabled()) {

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接