将Mongo聚合查询转换为java对象

将Mongo聚合查询转换为java对象,java,mongodb,mongodb-query,aggregation-framework,Java,Mongodb,Mongodb Query,Aggregation Framework,我正在尝试将mongo聚合查询转换为java对象。当我在RoboMongo(工具)中运行查询时,我会得到结果,但转换为java对象会得到空结果 Mongo查询: db.getCollection('wb_physicians').aggregate([ { $match: { $and: [ { "product.mpoCode": "VA001"}, { "product.n

我正在尝试将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" }
        }
    }
])
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;
}   
Java代码:

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" }
        }
    }
])
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;
}   
您能帮助我在哪里做了错误的映射吗?

问题正在解决中:

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")
        )
    ))
);

尽管如此,通过指定文档的逗号分隔表达式以及删除之前的管道,您可以不使用显式逻辑 因为这是相当不必要的,所以您修改后的管道可以按以下方式运行:

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;
}   
私有静态聚合输出FindProviderAndSpeciality(DBCollection集合){
DBObject match=新的基本对象($match),
新的BasicDBObject(“product.mpoCode”、“VA001”).append(“product.npoCode”,
新的BasicDBObject(“$exists”,“true”)
)        
);
DBObject unwind=newBasicDBObject(“$unwind”,“$product.specialties”);
DBObject group=新的BasicDBObject($group),
新的BasicDBObject(“\u id”,新的BasicDBObject(“providerId”,“$providerId”))
.append(“specialityCodeList”,
新的BasicDBObject($addToSet,“$product.specialties.code”)
)
);
列表管道=Arrays.asList(匹配、展开、组);
AggregationOutput输出=collection.aggregate(管道);
返回输出;
}   

+1,以清楚地显示您正在尝试做什么以及您迄今为止已经尝试了什么;并说明出错的原因。感谢您的回答。我得到了结果。当我尝试迭代聚合输出时,为(DBObject ldocFromDB:cursorDoc.results())的“providerId”获取null poniter({DBObject providerId=(DBObject)ldocFromDB.get(PROVIDER_ID);BasicDBList specialtyList=(BasicDBList)ldocFromDB.get(“specialityCodeList”)}但是得到了基本列表值的结果。你能帮我获取DBObject值吗。这是输出“_id”:{“providerId”:“3310100”,“productCode”:“CONNECT”},“specialityCodeList”:[“OP”]}看起来已经解决了,不是吗?至于另一个问题,那将是A,考虑分开发布。