0

$ project(集計)と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バージョンでは、以下の集計式を使用できます。

$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)); 
    }; 
関連する問題