В вашем документе есть поле массива "contentList", которое будет иметь несколько "lang".Я предполагаю, что вы хотите отфильтровать / получить все те документы, в которых по крайней мере один "lang" в "contentList" равен "en".Затем используйте:
Criteria elementMatchCriteria = Criteria.where("contentList.lang").is("en"));
Если вы хотите, чтобы во внутреннем массиве был только тот объект, где lang = 'en', вам нужно использовать конвейер агрегации, например:
Ссылка: https://mongoplayground.net/p/JaJ7420i4qJ
db.collection.aggregate([
{
$match: {
"lang_content_list.lang": "en"
}
},
{
$unwind: "$lang_content_list"
},
{
$match: {
"lang_content_list.lang": "en"
}
},
{
$group: {
"_id": "$_id",
"_class": {
$first: "$_class"
},
"lang_content_list": {
$push: "$lang_content_list"
}
}
}
])
Причиной использования последнего группового этапа является то, что в вашем объекте contentList является массивом, поэтому нам нужно обернуть объект lang как массив, в противном случае нет необходимости, если вы можете изменить объект возвращаемого типа.
Весенний код MongoTemplate:
AggregationOperation match = Aggregation.match(Criteria.where("lang_content_list.lang").is("en"));
AggregationOperation unwind = Aggregation.unwind("lang_content_list");
AggregationOperation group = Aggregation.group("_id")
.first("_class").as("_class")
.push("lang_content_list").as("lang_content_list");
List<AggregationOperation> operations = new ArrayList<>();
operations.add(match);
operations.add(unwind);
operations.add(match);
operations.add(group);
Aggregation aggregation = Aggregation.newAggregation(operations);
List<Product> results = mongoTemplate.aggregate(aggregation, Product.class, Product.class).getMappedResults();