使用mongo Java Driver 3.0从Mongo集合中创建字段的不同值时出现异常

时间:2015-08-19 06:19:32

标签: java mongodb mongodb-query mongodb-java

我从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.

1 个答案:

答案 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);