0

我有一个教育机构文件,看起来像这样:

{ name: ..., addresses: [...], courses: [ {name: ... , duration: ..., tags[...]} ] }

tags有一个 String 数组。

我正在尝试查找其中包含一些标签的课程,例如:javaeclipsestruts等等...

我的搜索方法如下所示:

public BasicDBList coordinates(List tags){

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

我对这个实现有两个问题:

1- 如果一门课程匹配某个参数,则此查询返回所有机构课程。例如,如果我搜索java并且该机构有一些 Java 课程,所有课程都会返回

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

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

4

1 回答 1

1

您必须首先展开课程,否则它将被视为一个数组,并且查询将尝试找到您的整个文档(机构)而不是列表元素(课程)

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"));
于 2013-08-25T09:22:30.657 回答