0

$ project (Aggregation) 및 Include Fields (Query)를 시도했지만 Id 및 Filtered 필드 만 포함합니다. 우리의 예상 된 결과는 임베디드 문서가 로케일 (동적 키)로 필터링 된 문서와 함께 모든 필드를 갖게되는 것입니다.쿼리에서 필드 포함을 사용하지 않고 집계 필드와 함께 모든 필드를 가져와야합니다.

예 :

categories:[{ 
_id: 1, 
categoryNumber: "12345", 
locale: { 
       en_US: { 
           name: "Category Name in US" 
       }, 
       fr_FR: { 
           name: "Category Name in French" 
       } 
} 
}, 
{ 
_id: 2, 
categoryNumber: "6789", 
locale: { 
       en_GB: { 
           name: "Category Name in UK" 
       } 
} 
}] 

Expected Result: 

Filter records by locale: en_US(Embedded document key) 

[{ 
_id: 1, 
categoryNumber: "12345", 
locale: { 
       en_US: { 
           name: "Category Name in US" 
       } 
} 
}] 

검색어 :

AggregationOperation matchOperaion = match(where(Constants.ID).is(clientProdTypeId)); 

           AggregationExpression aggregationExpression = (AggregationOperationContext) -> { 
              Map<String, Object> conditionMap = new HashMap<>(); 
              conditionMap.put("input", "$locale.en_US.name"); 
              conditionMap.put("as", Constants.NAME); 
              conditionMap.put("cond", new BasicDBObject()); 
              return new BasicDBObject("$filter", conditionMap); 
           }; 

           AggregationOperation projectionOperation; 


              projectionOperation = project().and(aggregationExpression).as(Constants.METADATA) 
                      .andInclude(Constants.CLIENT_ID, Constants.PRODUCT_TYPE_ID,Constants.STATUS); 


           AggregationResults<CategoryDTO> result; 

           try { 
              result = mongoOperations.aggregate(newAggregation(matchOperaion, projectionOperation), 
                      Category.class, CategoryDTO.class); 
           } catch (IllegalArgumentException | DataAccessException e) { 
              LOGGER.error("Error while fetching client product type", e); 

           } 
           return result.getUniqueMappedResult(); 
+2

집계 쿼리는 어디에 있습니까? – barbakini

+0

질문을 업데이트했습니다 –

답변

0
db.collection.find({locale.en_US:{$exists : true}}); 
+0

로케일별로 레코드 필터링 : en_US (포함 된 문서 키) – Sam

1

대신 $project 사용 $addFields. $project은 지정된 필드 만 전달하고 $addFields은 새 필드/계산 된 필드와 함께 모든 필드를 전달합니다.

1

3.4 버전에서 아래 집계 표현식을 사용할 수 있습니다.

$objectToArray

로케일에 입력 키 값 쌍으로 locale$filter 변환하고 $arrayToObject 동적 키 다시 변환.

AggregationExpression aggregationExpression = (AggregationOperationContext) -> { 
    Map<String, Object> conditionMap = new HashMap<>(); 
    conditionMap.put("input", new BasicDBObject("$objectToArray", "$locale")); 
    conditionMap.put("as", "result"); 
    conditionMap.put("cond", new BasicDBObject("$$result.k", "en_US")); 
    return new BasicDBObject("$arrayToObject", new BasicDBObject("$filter", conditionMap)); 
    }; 
관련 문제