У меня есть массив внутри документа.
{
"id" : "id_1",
"name" : "name_1";
"additionalData" : [
{
"additionalDataId" : "id_1_1",
"additionalDataName" : "name_1_1",
"longText" : "A long story about..."
},
{
"additionalDataId" : "id_1_2",
"additionalDataName" : "name_1_2",
"longText" : "A longer story about danger..."
},
{
"additionalDataId" : "id_1_3",
"additionalDataName" : "name_1_3",
"longText" : "A longer story about danger and courage"
},
]
}
Чтобы получить элемент массива с именем "name_1_2", я использую запрос mongo.
db.collection.find( { name: "name_1"},
{ _id: 0, additionalData: { $elemMatch: { "additionalDataName": "name_1_2" } }
})
Как сделать то же самое с помощью mongoTemplate?
я пытался
Aggregation aggregation = Aggregation.newAggregation(
Aggregation.match(
Criteria.where("name").is("name_1").and("additionalData.additionalDataName").is("name_1_2")
),
Aggregation.project("additionalData"),
); mongoTemplate.aggregate(агрегация, "CustmObjects", Object.class);
И я также пытался использовать ArrayOperators.Filter.filter, я использовал этот ответ.
Aggregation aggregation = Aggregation.newAggregation(
Aggregation.match(Criteria.where("name").is("name_1")),
Aggregation.project("additionalData").and(
ArrayOperators.Filter.filter("additionalData").as("item")
.by(ComparisonOperators.valueOf("item.additionalDataName").equalTo("name_1_2"))
)
);
mongoTemplate.aggregate(aggregation, "CustmObjects", Object.class);
https://stackoverflow.com/a/46769125/4587961
Так или иначе, в результате я получил все элементы массива. Пожалуйста помоги!
Я напишу через 9 часов. Сейчас не на работе. Не работает с Aggregate и ArrayOperators.Filter
Хорошо, лучше на самом деле показать, что вы пытались, чтобы мы могли указать, что именно вы все равно сделали неправильно. Хотя я думал, что ранее связывал вас с реализацией spring-mongo именно этого $filter использования. Так что немного не уверен, какую часть вы не поняли правильно. Либо так, либо я привел неправильный пример :(
@NeilLunn Я обновил.




Если я правильно понял вопрос, это даст желаемые результаты.
Query query = new Query(new Criteria().andOperator(
Criteria.where("name").is("name_1"),
Criteria.where("additionalData.additionalDataName").is("name_1_2")
));
query.fields().include("additionalData").exclude("_id");
List<Document> results = template.find(query, collectionName, org.bson.Document.class);
Это дает список, но вопрос в том, чтобы получить этот объект - { "additionalDataId" : "id_1_2", "additionalDataName" : "name_1_2", "longText" : "Более длинная история об опасности..." }
$elemMatchпроекция недоступна вaggregate(). Вместо этого используйте вариант.findили$filter, как показано в ответах, на которые вы ссылаетесь.