2016-11-16 1 views
0

У меня есть структура документа ниже.Как фильтровать массив в документе Mongodb с использованием Spring

{ 
    "_id" : { "teacherId" : "<teacherId>", "Year" : "<Year>" }, 
    "groups" : [ { 
     "groupId" : "<uuid>", 
     "groupName" : "<name>", 
     "groupNameLowerCase" : "<name_in_lower_case>", 
     "description" : "<desc>", 
     "students" : ["<studentid1>", "<studentid2>", ...], 
     "editedDate" : "<currentTimestamp>" 
     }, 
     ... 
    ], 
    "editedDate" : "<currentTimestamp>", 
    "points" : "<points>" 
} 

Считают, что ниже двух документов присутствуют в БД

{ 
    "_id" : { "teacherId" : "1", "Year" : "2016" }, 
    "groups" : [ { 
     "groupId" : "123", 
     "groupName" : "Test1", 
     "groupNameLowerCase" : "test1", 
     "description" : "sample document", 
     "students" : ["11", "22"] 
     }, 
    { 
     "groupId" : "234", 
     "groupName" : "Test2", 
     "groupNameLowerCase" : "test2", 
     "description" : "sample document", 
     "students" : ["11", "22"] 
     }, 
     { 
     "groupId" : "345", 
     "groupName" : "Test3", 
     "groupNameLowerCase" : "test3", 
     "description" : "sample document", 
     "students" : ["21", "32"] 
     } 
    ], 
    "points" : "650" 
} 

{ 
    "_id" : { "teacherId" : "1", "Year" : "2015" }, 
    "groups" : [ { 
     "groupId" : "123", 
     "groupName" : "HOCKEY", 
     "groupNameLowerCase" : "HOCKEY", 
     "description" : "HOCKEY team", 
     "students" : ["11", "22"] 
     }, 
     { 
     "groupId" : "234", 
     "groupName" : "football", 
     "groupNameLowerCase" : "football", 
     "description" : "sample football", 
     "students" : ["11", "22"] 
     }, 
     { 
     "groupId" : "345", 
     "groupName" : "Test3", 
     "groupNameLowerCase" : "test3", 
     "description" : "sample document", 
     "students" : ["21", "32"] 
     } 
    ], 
    "points" : "650" 

Я хочу, чтобы выбрать группы для указанного студента и преподавателя комбинации. например Если я поставлю teacherid = 1 и student id = 11, тогда запрос должен вернуть два документа с соответствующими группами. Я написал ниже код, чтобы получить соответствующие группы в документе. Но потом я понимаю, что elemMatch вернет только соответствие первого элемента. Он вернет два документа, но только с одной группой.

Здесь я хотел бы узнать параметры, доступные в Mongodb 2.4, для фильтрации массивов в документе, возвращаемом некоторым запросом.

String teacherId = "1"; 
String studentId = "11"; 

Criteria documentSearchCriteria = where("_id.teacherId").is(teacherId) 
       .and("groups") 
       .elemMatch(where("students").in(studentId)); 

Criteria groupFilterCriteria = where("groups").elemMatch(where("students").in(studentBid)); 
BasicQuery query = new BasicQuery(documentSearchCriteria.getCriteriaObject(), groupFilterCriteria.getCriteriaObject()); 
List<GroupsDocument> groupsDocumentList = groupsMongoTemplate.find(query, GroupsDocument.class); 

ответ

1

Как вы сказали elemMatch будет получать только первый объект в массиве, так что вы должны использовать совокупное будущее для достижения вашего выходной

MatchOperation match = Aggregation.match(Criteria.where("_id.teacherId").is("1").and("groups.students").in(11)); 
    UnwindOperation unwind = Aggregation.unwind("groups"); 
    GroupOperation group = Aggregation.group("_id").push("groups").as("groups").first("points").as("points"); 
    Aggregation aggregation = Aggregation.newAggregation(unwind, match, group); 
    AggregationResults<BasicDBObject> groupResults = mongoTemplate.aggregate(aggregation, 
        CustomGroupsDocument.class, BasicDBObject.class); 
    List<BasicDBObject> result = groupResults.getMappedResults(); 
+0

У вас есть пример для этого – Sachin

+0

Я обновил код –

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