как получить сумму поля массива int в проекции в весенних данных mongodb

Образец документа из коллекции

{
    "_id" : 2,
    "student" : "Ryan",
    "homework" : [
        5,
        6,
        5
    ],
    "quiz" : [
        8,
        8
    ],
    "extraCredit" : 8
}

Агрегационный запрос в mongodb

db.scores.aggregate([
     {
        $project : {
            _id:"$_id",
            hSum : { $sum: "$homework" },
            qSum : { $sum: "$quiz"},
        }
     }])

Вывод вышеуказанного запроса агрегации

{
    "_id" : 2,
    "hSum" : 16,
    "qSum" : 16
}

Я хочу преобразовать приведенный выше запрос mongo в формат spring-data. Я хочу выполнить агрегацию с помощью проекционных операций в весенних данных. как написать с помощью projectOperation?


person Adarsh Patel    schedule 14.02.2018    source источник
comment
что ты уже испробовал? А также я думаю, что ваш ожидаемый результат неверен. 5+6+5 = 16 и 8+8 = 16   -  person pvpkiran    schedule 14.02.2018
comment
Я пробовал это в терминале монго. и это дает показанный результат. запрос работает нормально. Я просто хочу преобразовать этот запрос в формат Spring-данных, помогите, пожалуйста?   -  person Adarsh Patel    schedule 14.02.2018
comment
как 5 + 6 + 5 = 25 и 8 + 8 = 18 не могли бы вы объяснить это   -  person pvpkiran    schedule 14.02.2018
comment
Серьезная ошибка в выборе неправильного выхода. я показал результат id:1 моя ошибка @pvpkiran   -  person Adarsh Patel    schedule 14.02.2018
comment
агрегатная операция имеет смысл, если вы работаете с несколькими документами. Но если вы делаете в одном документе, лучше, если вы просто прочитаете документ и сделаете расчет в своем коде.   -  person pvpkiran    schedule 14.02.2018


Ответы (1)


Это должно работать

MatchOperation matchOperation = match(Criteria.where("_id").is(2));

AggregationExpression homeworkExpression = AccumulatorOperators.Sum.sumOf("homework");
AggregationExpression quizExpression = AccumulatorOperators.Sum.sumOf("quiz");
ProjectionOperation projectionOperation = project("someId").and(homeworkExpression).as("hSum")
        .and(quizExpression).as("qSum");

Aggregation aggregation = newAggregation( matchOperation, projectionOperation);
AggregationResults<Result> results = mongoTemplate.aggregate(aggregation, "ScoresColletionName", Result.class);

Вы можете создать класс с именем Result, чтобы получить значения

@Getter
@Setter
class Result {
    private int someId;
    private int hSum;
    private int qSum;
}
person pvpkiran    schedule 14.02.2018
comment
как я могу это сделать, если у меня есть массив объектов, и я хочу сумму поля всех из них? - person Wrong; 07.06.2019