我必须关注Db数据:

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


我想使用汇总来获取每个用户的每个CORRECT \ WRONG的计数,即

{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(),但这是无效的。我如何获取计数值呢?

谢谢

最佳答案

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

Mongo外壳:

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")
);

10-06 14:00
查看更多