【问题标题】:Converting Mongo aggregate query into java objects将 Mongo 聚合查询转换为 java 对象
【发布时间】:2017-08-29 05:18:03
【问题描述】:

我正在尝试将 mongo 聚合查询转换为 java 对象。当我在 RoboMongo(工具)中运行查询时,我得到了结果,但转换为 java 对象会得到空结果。

Mongo 查询:

db.getCollection('wb_physicians').aggregate([
    { 
        $match: { 
            $and: [ 
                { "product.mpoCode": "VA001"}, 
                { "product.npoCode": { $exists: true } }
            ] 
        }
    },
    { 
        "$project" : { 
            "product.specialties.code": 1, 
            "providerId": 1,
            "product.code": 1, 
            "_id" : 0
        }
    }, 
    { "$unwind" : "$product.specialties" },
    { 
        "$group" : { 
            "_id" : { 
                "providerId": "$providerId" , 
                "productCode": "$product.code"
            }, 
            "specialityCodeList": { "$addToSet": "$product.specialties.code" }
        }
    }
])

Java 代码:

private static AggregationOutput findProviderandSpecialty(DBCollection collection) {
    DBObject match =  new BasicDBObject("$match" , 
        new BasicDBObject("$and", Arrays.asList(
            new BasicDBObject("product.mpoCode" , "VA001").append("product.npoCode", "$exists: true")
        ))
    );

    DBObject project =  new BasicDBObject("$project" , 
        new BasicDBObject("product.specialties.code" , 1)
            .append("providerId" , 1)
            .append("product.code", 1)
            .append("_id", 0)
    );  

    DBObject unwind = new BasicDBObject("$unwind" , "$product.specialties");

    DBObject group = new BasicDBObject("$group",
        new BasicDBObject("_id", new BasicDBObject("providerId" , "$providerId"))
            .append("specialityCodeList", 
                new BasicDBObject("$addToSet", "$product.specialties.code")
            )
    );

    AggregationOutput output = collection.aggregate(match,project,unwind,group);    

    return output;
}   

您能帮我在哪里做错映射吗?

【问题讨论】:

  • +1 问题清楚地显示了您正在尝试做的事情以及到目前为止您已经尝试过的事情;并说明出了什么问题。

标签: java mongodb mongodb-query aggregation-framework


【解决方案1】:

问题出在$match管道上:

DBObject match =  new BasicDBObject("$match" , 
    new BasicDBObject("$and", Arrays.asList(
        new BasicDBObject("product.mpoCode" , "VA001")
           .append("product.npoCode", "$exists: true")
    ))
);

应该是

DBObject match =  new BasicDBObject("$match" , 
    new BasicDBObject("$and", Arrays.asList(
        new BasicDBObject("product.mpoCode" , "VA001"),
        new BasicDBObject("product.npoCode", 
            new BasicDBObject("$exists", "true")
        )
    ))
);

尽管如此,您可以通过指定文档的逗号分隔表达式以及删除 $project$group 因为它相当不必要,所以您修改后的管道可以运行为:

db.getCollection('wb_physicians').aggregate([
    { 
        "$match": { 
            "product.mpoCode": "VA001", 
            "product.npoCode": { "$exists": true }             
        }
    },    
    { "$unwind" : "$product.specialties" },
    { 
        "$group" : { 
            "_id" : { 
                "providerId": "$providerId" , 
                "productCode": "$product.code"
            }, 
            "specialityCodeList": { "$addToSet": "$product.specialties.code" }
        }
    }
])

以及最终的 Java 代码:

private static AggregationOutput findProviderandSpecialty(DBCollection collection) {
    DBObject match =  new BasicDBObject("$match" , 
        new BasicDBObject("product.mpoCode" , "VA001").append("product.npoCode",             
            new BasicDBObject("$exists", "true")
        )        
    );

    DBObject unwind = new BasicDBObject("$unwind" , "$product.specialties");

    DBObject group = new BasicDBObject("$group",
        new BasicDBObject("_id", new BasicDBObject("providerId" , "$providerId"))
            .append("specialityCodeList", 
                new BasicDBObject("$addToSet", "$product.specialties.code")
            )
    );

    List<DBObject> pipeline = Arrays.<DBObject>asList(match, unwind, group);
    AggregationOutput output = collection.aggregate(pipeline);    

    return output;
}   

【讨论】:

  • 感谢您的回复。我得到了结果。当我尝试迭代聚合输出时,为 (DBObject ldocFromDB : cursorDoc.results()) { DBObject providerIds = ( DBObject) ldocFromDB.get(PROVIDER_ID); BasicDBList specialList = (BasicDBList) ldocFromDB.get("specialityCodeList"); } 但得到了 BasicDBList 值的结果。您能否帮助我了解如何获取 DBObject 值。这里是输出 "_id" : { "providerId" : "3310100", "productCode" : "CONNECT" }, "specialityCodeList" : [ "OP" ] }
  • 看起来Converting Mongo aggregate query into java objects 解决了不是吗?至于另一个问题,那就是different question,考虑单独发一下。
猜你喜欢
  • 2021-06-19
  • 1970-01-01
  • 2021-09-03
  • 2020-06-06
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
相关资源
最近更新 更多