sim*_*lue 3 java mongodb mongodb-java mongodb-query
我从 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。在我看来,你有两种方法可以解决这个问题。
还要注意的是,一般来说,“迭代器”对于“不同”列表来说是多余的,所以直接使用 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);
Run Code Online (Sandbox Code Playgroud)
或者接受结果作为 BsonValue 并处理这些结果:
ArrayList<BsonValue> distinct = coll.distinct("tenantId", BsonValue.class)
.into(new ArrayList<BsonValue>());
System.out.println(distinct);
Run Code Online (Sandbox Code Playgroud)
但在后一种情况下,您仍然需要处理返回的类型。有一些方法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);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2723 次 |
| 最近记录: |