使用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
转换为Bson
的BasicDbObject
。
非常感谢提前。
谷歌搜索更加困难,我找到了一个很好的打印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());