Java MongoDB匹配数组中的所有元素

Java MongoDB匹配数组中的所有元素,java,mongodb,mongodb-java,Java,Mongodb,Mongodb Java,我有一份教育机构文件,看起来是这样的: { 姓名:。。。, 地址:[……], 课程:[{名称:…,持续时间:…,标记[…]}] } 标记有一个字符串数组 我正在尝试找到一个里面有一些标签的课程,比如:java、eclipse、struts等等 我的搜索方法如下所示: 公共基本列表坐标(列表标记){ BasicDBObject cmdBody=新的BasicDBObject(“聚合”、“教育机构”); 列表管道=新的ArrayList(); BasicDBObject projectPara

我有一份教育机构文件,看起来是这样的:


{
姓名:。。。,
地址:[……],
课程:[{名称:…,持续时间:…,标记[…]}]
}

标记有一个字符串数组

我正在尝试找到一个里面有一些标签的课程,比如:java、eclipse、struts等等

我的搜索方法如下所示:


公共基本列表坐标(列表标记){

BasicDBObject cmdBody=新的BasicDBObject(“聚合”、“教育机构”);
列表管道=新的ArrayList();
BasicDBObject projectParams=新的BasicDBObject();
项目参数put(“名称”,1);
projectParams.put(“addresses.state”,1);
projectParams.put(“addresses.locs”,1);
项目参数put(“课程”,1);
添加(新的BasicDBObject(“$project”,projectParams));
添加(新BasicDBObject($match),新BasicDBObject(“courses.tags”,新BasicDBObject($all,tags)));
添加(新的BasicDBObject(“$unwind”,“$ADDRESS”);
cmdBody.put(“管道”,管道);
如果(!getDatastore().getDB().command(cmdBody).ok()){
抛出新的MongoException(getDatastore().getDB().command(cmdBody.getErrorMessage());
}
return(BasicDBList)getDatastore().getDB().command(cmdBody.get(“结果”);
}

我对此实施有两个问题:

1-如果一门课程与某个参数匹配,此查询将返回所有院校课程。例如,如果我搜索java,而该机构有一些java课程,则所有课程都将返回

2-似乎$all不太好用。 看起来我的查询是在搜索一些课程中有这些标签的教育机构,而不是搜索一些课程中有这些标签


有人能告诉我我做错了什么吗?

你必须先解开课程,否则它将被视为一个数组,查询将试图找到比列表元素(课程)更大的整个文档(机构)

    BasicDBObject cmdBody = new BasicDBObject("aggregate", "EducationalInstitution");

    List<BasicDBObject> pipeline = new ArrayList<BasicDBObject>();

    BasicDBObject projectParams = new BasicDBObject();
    projectParams.put("name", 1);
    projectParams.put("addresses.state", 1);
    projectParams.put("addresses.locs", 1);
    projectParams.put("courses", 1);


    pipeline.add(new BasicDBObject("$project", projectParams));
    pipeline.add(new BasicDBObject("$match", new BasicDBObject("courses.tags", new BasicDBObject("$all", tags))));
    pipeline.add(new BasicDBObject("$unwind", "$addresses"));

    cmdBody.put("pipeline", pipeline); 

    if( !getDatastore().getDB().command(cmdBody).ok() ){

        throw new MongoException(getDatastore().getDB().command(cmdBody).getErrorMessage());
    }

    return (BasicDBList) getDatastore().getDB().command(cmdBody).get("result");
}
pipeline.add(new BasicDBObject("$project", projectParams));
pipeline.add(new BasicDBObject("$unwind", "$courses"));
pipeline.add(new BasicDBObject("$match", new BasicDBObject("courses.tags", new BasicDBObject("$all", tags))));
pipeline.add(new BasicDBObject("$unwind", "$addresses"));