我必须跟踪数据库数据:
{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() - 但它是无效的。我怎样才能获得计数值?
谢谢
最佳答案
解决此问题的一种方法是使用 $size
创建一个具有这些数组大小的额外字段。 $project
中的 运算符 管道步骤,然后将文档分组到 $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")
);
关于java - 蒙戈 : how to count several arrays in one aggregation via java's mongoTemplate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37409139/