0

Nous avons essayé avec $ project (Agrégation) et Include Fields (Query), mais il inclut uniquement les champs Id et Filtered. Notre résultat attendu est d'avoir tous les champs du document avec le document incorporé filtré par les paramètres régionaux (clé dynamique).Besoin d'obtenir tous les champs avec le champ Agréger sans utiliser Inclure les champs dans la requête

Exemple:

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" 
       } 
} 
}] 

Requête:

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

Où se trouve votre requête d'agrégation? – barbakini

+0

J'ai mis à jour la question –

Répondre

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

Il va filtrer les enregistrements par paramètres régionaux: en_US (clé de document incorporé) – Sam

1

Au lieu de $project utilisation $addFields. $project transmet uniquement les champs spécifiés tandis que $addFields passe tous les champs avec les champs new/calculate /.

1

Vous pouvez utiliser l'expression d'agrégation ci-dessous dans la version 3.4.

$objectToArray pour convertir les locale en paires de valeurs clés et $filter sur l'entrée locale et $arrayToObject à reconvertir les touches dynamiques.

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)); 
    };