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

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

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

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

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

Javadoc可以在这里找到。

我怎么能打印这样的物体? 我确信BasicDbObject类型有一个智能的toString实现,但我找不到从Bson转换为BsonBasicDbObject

非常感谢提前。

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

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

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

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

另一点, BsonDocument.toString()内部使用默认的JsonWriterSettings执行toJson() 。 为了查看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))); } } 

这是一个相当古老的问题,但我把我的建议(对于mongodb-driver 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());