我从mongodb获得了明显的字段值。
当我在命令行中运行以下查询时,它运行良好。
db.celldata.distinct("tenentId")
我正在使用Mongo java 3.0驱动程序,使用以下查询检索不同的值
MongoCursor<String> iterator = coll.distinct("tenantId", String.class).iterator();
当我运行查询时,我得到以下异常
org.bson.BsonInvalidOperationException: readString can only be called when CurrentBSONType is STRING, not when CurrentBSONType is NULL.
答案 0 :(得分:3)
嗯,这里错误的根本原因是因为您有String
类型作为预期输出,其中一个不同的值实际上是null
。我看待它的方式有两种方法可以解决这个问题。
还要注意一个&#34;迭代器&#34;对于一个&#34; distinct&#34;来说是过度的列表一般来说,所以直接进入ArrayList。
.filter()
输出不需要的null
值:
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
上有一些方法可以让你为此编码,但是获取一个不同的值列表也是有点过分。
因此,作为第三个&#34;选项,我会选择&#34; un-typed&#34;响应。 .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);