2017-10-09 63 views
0

中的所有字段以及Aggregate字段,而不使用包含字段,但它只包含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版本中使用下面的聚合表达式。

$objectToArraylocale到键值对,$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)); 
    };