2016-11-16 12 views
0

以下のドキュメント構造を持っています。Springを使用してMongodbドキュメントの配列をフィルタリングする方法

{ 
    "_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>" 
} 

はDB

{ 
    "_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を指定すると、クエリは一致するグループを持つ2つのドキュメントを返します。私は文書の中で一致するグループを得るために以下のコードを書いた。しかしその後、私はelemMatchが最初の要素マッチングだけを返すことを理解します。 2つの文書が返されますが、1つのグループしかありません。

ここでは、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

あなたがあなたの出力

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

を達成するために集計未来を使用する必要がありますのでelemMatchは、配列内の最初のオブジェクトを取得すると発表したとして、それが – Sachin

+0

私は、コードを更新したために、あなたがどんな例がありますか –

関連する問題