MongoDB 使用 Spring 数据 MongoDB 的项目和组操作

MongoDB Project and Group operations with Spring Data MongoDB

我想使用 Spring 数据 MongoDB 来执行以下查询,但我卡在了 project 操作上,我需要一些帮助。
这是要翻译的查询:

db.getCollection("employee_salaries").aggregate([
    { $match: {
        salaries: {
            $elemMatch: { 
              "to_date": { $gte: "1985-01-01" } ,  
              "to_date": { $lte: "1986-01-01" }
            } 
        }
    }},
    { $project: {
        salaries: {
            $filter: {
                input: "$salaries",
                as: "salaries",
                cond: {$and: [
                    { $gte: ["$$salaries.to_date", "1985-01-01"]},
                    { $lt: ["$$salaries.to_date", "1986-01-01"]}
                ]}
            }
        }
    }},
    { $unwind: "$salaries"},
    { $group: {
        _id: "$null",
        "total_salary": { $sum: "$salaries.salary"}
    }}
])

这是我的尝试:

@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class SimpleService {

    private final MongoTemplate mongoTemplate;

    public Document aggregation() {

        MatchOperation matchOperation = match(Criteria.where("salaries").elemMatch(Criteria.where("to_date").gte("1985-01-01").lte("1986-01-01")));
        ProjectionOperation projectionOperation = project("salaries");
        // other operations
        UnwindOperation unwindOperation = unwind("salaries");

        Document rawResults = mongoTemplate.aggregate(newAggregation(
                matchOperation,
                // other operations...
        ), Salaries.class, String.class).getRawResults();

        return totalSalaryInOneYear;
    }
}

ProjectionOperationGroupOperation 所需的 imports 代码如下。

import static org.springframework.data.mongodb.core.aggregation.Aggregation.group;
import static org.springframework.data.mongodb.core.aggregation.Aggregation.project;
import static org.springframework.data.mongodb.core.aggregation.ArrayOperators.Filter.filter;
import org.springframework.data.mongodb.core.aggregation.BooleanOperators.And;
import org.springframework.data.mongodb.core.aggregation.ComparisonOperators.Gte;
import org.springframework.data.mongodb.core.aggregation.ComparisonOperators.Lt;

ProjectionOperation projectionOperation =  project().and(filter("salaries")
                 .as("salaries")
                 .by(And.and(Gte.valueOf("salaries.to_date").greaterThanEqualToValue("1985-01-01"),Lt.valueOf("salaries.to_date").lessThanValue("1986-01-01"))))
                 .as("salaries");

当您按 null 分组时,无需传递任何 ID。

GroupOperation groupOperation = group().sum("salaries.salary").as("tot‌​al_salary");

如果上述方法不起作用,您需要将一些 non-existing 字段传递给 group() 方法。确保传递的参数不属于您的集合。

GroupOperation groupOperation = group("NotAField").sum("salaries.salary").as("tot‌​al_salary");

任何进一步的问题,让我知道。