【问题标题】:Exception when geting distinct values of a field from Mongo collection using mongo Java Driver 3.0使用 mongo Java Driver 3.0 从 Mongo 集合中获取字段的不同值时出现异常
【发布时间】:2015-11-12 07:13:58
【问题描述】:

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

【问题讨论】:

    标签: java mongodb mongodb-query mongodb-java


    【解决方案1】:

    好吧,这里错误的根本原因是因为您有一个 String 类型作为预期输出,而其中一个不同的值实际上是 null。在我看来,您有两种处理方式。

    还要注意,一般来说,“迭代器”对于“不同”列表来说太过分了,所以直接转到 ArrayList。

    将不需要的null 值从.filter() 中取出:

        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 上有一些方法可以让您为此编写代码,但仅获取不同值的列表也有点矫枉过正。

    因此,作为“第三个”选项,我会选择带有“未键入”响应的内容。 .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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-26
      • 2021-04-03
      相关资源
      最近更新 更多