使用 mongo Java Driver 3.0 从 Mongo 集合中获取字段的不同值时出现异常
Exception when geting distinct values of a field from Mongo collection using mongo Java Driver 3.0
我从 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.
嗯,这里错误的根本原因是因为您有一个 String
类型作为预期的输出,而其中一个不同的值实际上是 null
。在我看来,您有两种处理方式。
还注意到 "iterator" 通常来说对于 "distinct" 列表来说有点矫枉过正,所以直接转到 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
上有一些方法可让您为此编写代码,但仅获取不同值的列表也有点矫枉过正。
因此,作为 "third" 选项,我会选择具有 "un-typed" 响应的内容。 .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);
我从 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.
嗯,这里错误的根本原因是因为您有一个 String
类型作为预期的输出,而其中一个不同的值实际上是 null
。在我看来,您有两种处理方式。
还注意到 "iterator" 通常来说对于 "distinct" 列表来说有点矫枉过正,所以直接转到 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
上有一些方法可让您为此编写代码,但仅获取不同值的列表也有点矫枉过正。
因此,作为 "third" 选项,我会选择具有 "un-typed" 响应的内容。 .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);