java - 蒙戈 : how to count several arrays in one aggregation via java's mongoTemplate

标签 java mongodb aggregation-framework mongotemplate

我必须跟踪数据库数据:

{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/

相关文章:

node.js - 如何根据常见的数组元素对文档进行匹配和排序

mongodb - 从两个字段创建一个数组

mongodb - 在蒙戈获得一个月的第一天。将 'yyyy-mm-dd-hh-mm-ss.SSS' 转换为 'yyyy-mm-01-00-00-00.000' 的时间戳

java - 拖动时滚动表格

java - 如何用 Tomcat 覆盖 spring 属性参数?

mysql - 使用 Neo4j 作为独立数据库的风险

php laravel 数组 excel mongodb

java - Jsf 2.0 自定义标签

java - 为什么 JAXB 会从架构中的两个字段生成单个 List<JAXBElement<String>> 字段?

mongodb - 如何为多个数据中心设置 MongoDB?