【问题标题】:how to get sum of int array field in projection in spring data mongodb如何在spring数据mongodb中获取投影中的int数组字段的总和
【发布时间】:2018-02-14 07:38:07
【问题描述】:

集合中的示例文档

{
    "_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 格式。 我想用 spring 数据中的 projectionOperations 进行聚合。用projectionOperation怎么写?

【问题讨论】:

  • 到目前为止您尝试过什么?而且我认为您的预期输出不正确。 5+6+5 = 16 和 8+8 =16
  • 我已经在 mongo 终端中尝试过这个。它给出了显示的输出。查询运行良好。我只是想将该查询转换为 spring-data 格式有什么帮助吗?
  • 5+6+5 = 25 和 8+8 =18 你能解释一下吗
  • 严重错误选择错误的输出。我已经显示了 id:1 的结果我的错误@pvpkiran
  • 如果您正在处理多个文档,则聚合操作很有意义。但是如果你是在单个文档中做,最好只是阅读文档并在代码中进行计算

标签: mongodb spring-data aggregation-framework spring-data-mongodb spring-mongodb


【解决方案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;
}

【讨论】:

  • 如果我拥有的是一个对象数组并且我想要所有这些对象的一个​​字段的总和,我该怎么做?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-13
  • 1970-01-01
相关资源
最近更新 更多