【问题标题】:Mongo: how to count several arrays in one aggregation via java's mongoTemplateMongo:如何通过 java 的 mongoTemplate 在一个聚合中计算多个数组
【发布时间】:2016-05-24 09:13:24
【问题描述】:

我必须关注 Db 数据:

{user : Tom, CORRECT: {q1, q3}, WRONG : {q2, q4} },
{user : jim, CORRECT: {q1}, WRONG : {q2, q3, q4} },
{user : Tom, CORRECT: {q6}, WRONG : {7} },

我想使用聚合来计算每个用户的每个正确\错误,即

{user : Tom, correctCount : 3, wrongCount : 3},
{user : jim, correctCount : 1, wrongCount : 3},

我试过的是这样的:

    Aggregation agg = newAggregation(
            group("name").
                    addToSet(correct).as(correct).
                    addToSet(wrong).as(wrong).
                    addToSet(partial).as(partial)
    );

但是对于每个用户,我都会获得完整的数据列表(即 q1、q2、q3...),我总是可以在该列表上执行 size() - 但它是无效的。我怎样才能得到计数值?

谢谢

【问题讨论】:

    标签: java mongodb aggregation-framework mongotemplate


    【解决方案1】:

    解决此问题的一种方法是在 $project 管道步骤中使用 $size 运算符创建一个具有这些数组大小的额外字段然后在 $group 管道中对文档进行分组,以获取累计总和作为新大小字段的计数:

    Mongo shell:

    db.collection.aggregate([
        {
            "$project": {
                "user": 1,
                "correctSize": { "$size": "$CORRECT" },
                "wrongSize": { "$size": "$WRONG" }
            }
        },
        {
            "$group": {
                "_id": "$user",
                "correctCount": { "$sum": "$correctSize" },
                "wrongCount": { "$sum": "$wrongSize" }
            }
        }
    ])
    

    Java:在项目步骤中使用SpEL andExpression来使用$size expression

    import static org.springframework.data.mongodb.core.aggregation.Expressions.*; //new
    ...
    Aggregation agg = newAggregation(
        project("user")
            .andExpression(expression("size", field("CORRECT"))).as("correctSize");
            .andExpression(expression("size", field("WRONG"))).as("wrongSize");
        group("user")
            .sum("correctSize").as("correctCount")
            .sum("wrongSize").as("wrongCount")
    );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-18
      • 2019-10-14
      • 2022-09-23
      • 1970-01-01
      • 2016-03-20
      • 2018-12-24
      • 2021-04-22
      • 1970-01-01
      相关资源
      最近更新 更多