Массив фильтров в поле массива вложенных документов в среде Spring

Я пытаюсь получить элемент из массива в MongoDB в моем проекте Spring Framework.

Я нашел решение для оболочки MongoDB, но я не знаю, как реализовать его с помощью Spring.data.core.aggregation, один из операторов агрегации @addFields не поддерживается Spring.

Может ли кто-нибудь сказать мне, как заменить этот @addField или как реализовать его по-другому? Большое спасибо!!!

Пример данных MongoDB:

{
    "_id" : 15,
    "items" : [
            {
                    "columns" : [
                            {
                                    "title" : "hhh",
                                    "value" : 10
                            },
                            {
                                    "title" : "hahaha",
                                    "value" : 20
                            }
                    ]
            },
            {
                    "columns" : [
                            {
                                    "title" : "hiii",
                                    "value" : 50
                            }
                    ]
            }
    ]
}

Ожидаемый результат:

{
"_id" : 15,
"items" : [
        {
                "columns" : [
                        {
                                "title" : "hahaha",
                                "value" : 20
                        }
                ]
        },
        {
                "columns" : []
        }
]

}

Решение для оболочки MongoDB:

let value = "hahaha";

db.coll.aggregate([
    {
        "$addFields": { 
            "items": { 
                "$map": { 
                    "input": "$items", 
                    "as": "item", 
                    "in": { 
                        "columns": { 
                            "$filter": { 
                                "input": "$$item.columns", 
                                "as": "elt", 
                                "cond": { "$eq": [ "$$elt.title", value ] } 
                            } 
                        }
                    }
                } 
            } 
        } 
    } 
])

Версия MongoDB: 3.4.1
Весенняя версия: 1.4.3


person Spider    schedule 25.01.2017    source источник


Ответы (1)


Вы можете попробовать следующее, но вам нужно будет использовать версию 1.8.5.

Aggregation aggregation = newAggregation(
            project("_id").and(new AggregationExpression() {
                @Override
                public DBObject toDbObject(AggregationOperationContext aggregationOperationContext) {
                    DBObject filter = new BasicDBObject("input", "$$item.columns").append("as", "elt").append("cond",
                            new BasicDBObject("$eq", Arrays.<Object>asList("$$elt.title", "hahaha")));
                    DBObject map = new BasicDBObject("input", "$items").append("as", "item").append("in", filter);
                    return new BasicDBObject("$map", map);
                }
            }).as("items")
  );

Поддержка некоторых операторов агрегации Mongo3.2 была добавлена ​​в 1.10.0.RC1. Если вы согласны с обновлением до версии-кандидата на выпуск, вы можете использовать приведенную ниже версию. Я не смог найти $addFields этап в RC, поэтому оставил $project этап.

Aggregation aggregation = newAggregation(
            project("_id")
                    .and(mapItemsOf("items").as("item").andApply(filter("item.columns")
                            .as("elt")
                            .by(valueOf("elt.title").equalToValue("hahaha"))
                    )).as("items")
);

Статический импорт:

import static org.springframework.data.mongodb.core.aggregation.Aggregation.*;
import static org.springframework.data.mongodb.core.aggregation.ArrayOperators.Filter.filter;
import static org.springframework.data.mongodb.core.aggregation.ComparisonOperators.Eq.valueOf;
import static org.springframework.data.mongodb.core.aggregation.VariableOperators.mapItemsOf;
person s7vr    schedule 25.01.2017
comment
Спасибо за ваше предложение, но изменение версии слишком сложно для меня. - person Spider; 02.02.2017
comment
Spring boot 1.4.3 имеет версию spring mongo db 1.9.6. Так что первый вариант должен вам подойти. Ты пробовал ? - person s7vr; 02.02.2017