2017-05-13 3 views
0

다음은 내 원주민 MongoDB 쿼리이며 아래는 SpringData Mongo API에 해당합니다. SpringData Mongo API의 $ 프로젝트에서 $ map을 사용하는 것에 대해 고심하고 있습니다. 당신은 $map 집계 아래 시도 할 수 있습니다 API

db.users.aggregate([  
    { $match: {$and : [{userType:"200"} },  
    { $unwind: "$userOrgMap" }, 
    { 
     $lookup: 
     { 
      from: "users", 
      localField: "userOrgMap.createdbyuser", 
      foreignField: "_id", 
      as: "created_by" 
     } 
    }, 
    {$project:{ 
     _id:"$_id", 
     login:"$login", 
     firstName:"$firstName", 
     lastName:"$lastName", 
     email:"$email", 
     deactivateFlag:"$deactivateFlag", 
     createdOn:"$createdOn", 
     createdBy:{ 
     "$map": { 
        "input": "$created_by", 
        "as": "u", 
         "in": { 
          "name": { "$concat" : [ "$$u.firstName", " ", "$$u.lastName" ] }, 
         } 
       } 
    } 
     } 
    }, 
    { $sort : { createdBy : 1} } 

]) 

봄 쿼리

Aggregation aggregation = newAggregation(
      Aggregation.match(Criteria.where("userType").is(userType)), 
      Aggregation.unwind("userOrgMap"), 
      Aggregation.lookup("users", "userOrgMap.createdbyuser", "_id", "created_by"), 
      Aggregation.project("userId","login","firstName","lastName","email","deactivateFlag","createdOn") 
     ); 
+0

의 가능한 복제 http://stackoverflow.com/questions/41847249/filter-array-in-sub-document-array-field-in -spring-framework) – Veeram

+0

정보 주셔서 감사합니다. 하지만 API를 이해하려면 좀 더 도움이 필요합니다. 내 요구 사항이 다릅니다. ("created_by"). as ("u"). Aggregation.project ("userId", "login", "firstName", "lastName", "email", "deactivateFlag", "createdOn") \t \t .and (mapItemsOf). \t \t \t \t ??? \t \t)). ("createdBy")로 – karmaker

답변

0

내 전환을 완료에 도움을 주셔서 감사합니다.

project().and(mapItemsOf("created_by"). 
          as("u"). 
          andApply(new AggregationExpression() { 
           @Override 
           public DBObject toDbObject(AggregationOperationContext aggregationOperationContext) { 
            return new BasicDBObject("name", StringOperators.valueOf("u.firstName").concat(" ").concatValueOf("u.lastName").toDbObject(aggregationOperationContext)); 
           } 
          })) 
      .as("createdBy"); 

$let 표현

project().and(VariableOperators.Let.define(VariableOperators.Let.ExpressionVariable.newVariable("u").forExpression(ArrayOperators.arrayOf("created_by").elementAt(0))). 
          andApply(new AggregationExpression() { 
           @Override 
           public DBObject toDbObject(AggregationOperationContext aggregationOperationContext) { 
            return new BasicDBObject("name", StringOperators.valueOf("u.firstName").concat(" ").concatValueOf("u.lastName").toDbObject(aggregationOperationContext)); 
           } 
          })) 
      .as("createdBy"); 

사용 람다 및 고정 수입을 사용.

import static org.springframework.data.mongodb.core.aggregation.ArrayOperators.arrayOf; 
import static org.springframework.data.mongodb.core.aggregation.StringOperators.valueOf; 
import static org.springframework.data.mongodb.core.aggregation.VariableOperators.Let.ExpressionVariable.*; 
import static org.springframework.data.mongodb.core.aggregation.VariableOperators.Let.define; 
import static org.springframework.data.mongodb.core.aggregation.VariableOperators.mapItemsOf; 

project().and(mapItemsOf("created_by"). 
       as("u"). 
       andApply(aggregationOperationContext -> new BasicDBObject("name", valueOf("u.firstName").concat(" ").concatValueOf("u.lastName").toDbObject(aggregationOperationContext)))) 
       .as("createdBy"); 

    project().and(define(newVariable("u").forExpression(arrayOf("created_by").elementAt(0))). 
      andApply(aggregationOperationContext -> new BasicDBObject("name", valueOf("u.firstName").concat(" ").concatValueOf("u.lastName").toDbObject(aggregationOperationContext)))) 
      .as("createdBy"); 
[스프링 프레임 워크의 하위 문서 배열 필드 필터 어레이 (
+0

내가 정의되지 않은 – karmaker

+0

Np를 "로"무엇입니까 빠른 reply.But을 주셔서 감사합니다. 지도를 사용하기위한'name' 별칭을 포함하도록 답변이 업데이트되었습니다. 중첩 된 표현식에서 별칭을 제공하는 API는 볼 수 없습니다. 그래서'BasicDBObject'를 이용하여 표현식을 만들었습니다. '$ arrayElemAt'와'$ concat'을 사용하여'$ let' 연산자로도 이것을 할 수 있습니다. – Veeram

+0

내 실수. 그것은 효과가 있었다. 감사합니다 – karmaker