好吧,这里错误的根本原因是因为您有一个 String 类型作为预期输出,而其中一个不同的值实际上是 null。在我看来,您有两种处理方式。
还要注意,一般来说,“迭代器”对于“不同”列表来说太过分了,所以直接转到 ArrayList。
将不需要的null 值从.filter() 中取出:
ArrayList<String> distinct = coll.distinct("tenantId", String.class)
.filter(new Document("tenantId",new Document("$ne",null)))
.into(new ArrayList<String>());
System.out.println(distinct);
或者将结果作为 BsonValue 接受并处理:
ArrayList<BsonValue> distinct = coll.distinct("tenantId", BsonValue.class)
.into(new ArrayList<BsonValue>());
System.out.println(distinct);
但在后一种情况下,您仍然需要处理返回的类型。 BsonValue 上有一些方法可以让您为此编写代码,但仅获取不同值的列表也有点矫枉过正。
因此,作为“第三个”选项,我会选择带有“未键入”响应的内容。 .aggregate() 方法可以在这里工作,但它会在响应中是 BSON 文档,仍然取决于您是否转移到不同类型的普通 ArrayList:
ArrayList<Object> objects = new ArrayList<Object>();
MongoCursor<Document> iterator = coll.aggregate(Arrays.asList(
new Document("$group",
new Document("_id", "$tenantId")
)
)).iterator();
while (iterator.hasNext()) {
objects.add(iterator.next().get("_id"));
}
System.out.println(objects);