Mongo DB:根据具有嵌套数组的文档汇总文档输出

时间:2020-07-05 17:03:30

标签: spring mongodb spring-data mongo-java-driver

系统在DB中具有以下文档信息:

{
   "systemName": "ABC",
    "systemUsageAttrs" : [
                          {
                           "cpuUsage": 30,
                           "memUsage": 40,
                           "isActive": false
                           },
{
                           "cpuUsage": 88.2,
                           "memUsage": 33.5,
                           "isActive": false
                           },
                           {
                           "cpuUsage": 66.3,
                           "memUsage": 79.5,
                           "isActive": true
                           },
                           {
                           "cpuUsage": 80.5,
                           "memUsage": 63,
                           "isActive": true
                           }
                         ]
}

我尝试使用mongo java驱动程序进行仲裁,以下是以下代码段:

List<Document> systemDetailsAL = sysUsageDetailsColl.aggregate(
                asList(
                        match(eq("systemName","ABC")),
                        unwind("$systemUsageAttrs"),
                        match(eq("systemUsageAttrs.isAcive",true)),
                        group("$_id", Accumulators.push("systemName","$systemName"),
                                Accumulators.push("systemUsageAttrs", "$systemUsageAttrs")),
                        project(Projections.fields(Projections.excludeId(), 
                                                Projections.include("systemName", "systemUsageAttrs")))
                        
                        )
                ).into(new ArrayList<Document>());

以上提供了具有两个元素的ArrayList的输出,第0个元素的文档具有键“ systemName”,而值是具有两个元素的ArrayList。 第一个位置元素是Document的键为“ systemUsageAttrs”,值是ArrayList,其中包含两个元素,即所有系统使用情况详细信息。

尝试尝试的另一种方法是将上面的代码整理成组部分,因此它为我提供了2个文档的列表

{
    serverName: ABC, 
    systemUsageAttr: {
        cpuUSage: xxx, 
        memUsage: yyy, 
        isActive:true
}}

和第二份文件

{
    serverName: ABC, 
    systemUsageAttr: {
        cpuUSage: ttt, 
        memUsage: sss, 
        isActive:true
}}

是否可以使用聚合返回仅包含1个元素的列表,例如下面的输出

{
    serverName: ABC, 
    systemUsageAttr: [
        {
         cpuUSage: xxx, 
         memUsage: yyy, 
         isActive:true
        },
        {
         cpuUSage: ttt, 
         memUsage: sss, 
         isActive:true
        }
}

感谢任何帮助或指点。

1 个答案:

答案 0 :(得分:1)

更改这两个阶段:

group("$_id", Accumulators.push("systemName","$systemName"),
              Accumulators.push("systemUsageAttrs", "$systemUsageAttrs")),
project(Projections.fields(Projections.excludeId(), 
        Projections.include("systemName", "systemUsageAttrs")))                
)

如下所示,以获得所需的结果:

group("$_id", Accumulators.push("systemUsageAttrs", "$systemUsageAttrs"), 
              Accumulators.first("systemName", "$systemName")), 
project(Projections.excludeId()))

请注意Accumulators.first$first组聚合运算符)的用法。