Запрос Mongo DB в Java Spring-data Mongo

У меня есть массив внутри документа.

{
    "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

Так или иначе, в результате я получил все элементы массива. Пожалуйста помоги!

$elemMatch проекция недоступна в aggregate(). Вместо этого используйте вариант .find или $filter, как показано в ответах, на которые вы ссылаетесь.
Neil Lunn 06.03.2019 00:47

Я напишу через 9 часов. Сейчас не на работе. Не работает с Aggregate и ArrayOperators.Filter

Yan Khonski 06.03.2019 00:51

Хорошо, лучше на самом деле показать, что вы пытались, чтобы мы могли указать, что именно вы все равно сделали неправильно. Хотя я думал, что ранее связывал вас с реализацией spring-mongo именно этого $filter использования. Так что немного не уверен, какую часть вы не поняли правильно. Либо так, либо я привел неправильный пример :(

Neil Lunn 06.03.2019 00:54

@NeilLunn Я обновил.

Yan Khonski 06.03.2019 10:01
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
4
526
1

Ответы 1

Если я правильно понял вопрос, это даст желаемые результаты.

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" : "Более длинная история об опасности..." }

Coder17 15.09.2021 15:42

Другие вопросы по теме