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

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.

Bla*_*ven 5

好吧,这里错误的根本原因是因为您有一个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)