我使用的是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
的方法。
提前多多感谢。
答案 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);
答案 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());