我有一个教育机构文件,看起来像这样:
{
name: ...,
addresses: [...],
courses: [ {name: ... , duration: ..., tags[...]} ]
}
tags有一个 String 数组。
我正在尝试查找其中包含一些标签的课程,例如:java,eclipse,struts等等...
我的搜索方法如下所示:
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不太好用。看起来我的查询是在搜索一些在其课程中包含这些标签的教育机构,而不是在搜索一些在其中包含这些标签的课程
有人可以告诉我我做错了什么吗?