2013-08-25 2 views
0

У меня есть документ по вопросам образования, который, кажется, публичное, как это:MongoDB матч все элементы в массиве

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

теги имеет массив String.

Я пытаюсь найти курс, который имеет некоторые теги внутри, как: Java, затмение, распорки и так далее ...

Мой метод поиска выглядит следующим образом:

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

у меня есть 2 проблемы с этой реализации:

1- Этот запрос Ретур n курсы всех учреждений, если один курс соответствует некоторому параметру. Например, если я ищу Java и учреждение имеет некоторые Java курс, все курсы вернутся

2- Похоже $ все не работает так хорошо. Похоже, что мой запрос ищет какое-то учебное заведение, которое имеет эти теги на своих курсах, вместо этого для некоторого курса, который имеет эти теги внутри

Кто-то может сказать мне, что я делаю неправильно?

ответ

1

Вы должны раскручивать курсы первой otherway это будет рассматриваться как массив и запрос будет пытаться найти вас целые документы (учреждение) reather, чем элементы списка (курсы)

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

Спасибо дружище, это работал на меня !! – Buminda

Смежные вопросы