使用 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);