【问题标题】:Mongo DB: Aggregate Document output in terms of a Document with nested arrayMongo DB:根据带有嵌套数组的文档聚合文档输出
【发布时间】:2020-07-05 17:03:30
【问题描述】:

系统在 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 驱动程序的 arregration,下面是代码 sn-p:

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。 第一个位置元素是具有键“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
        }
}

感谢任何帮助或指点。

【问题讨论】:

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


    【解决方案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 组聚合运算符)的用法。

    【讨论】:

    • 非常感谢@prasad_,这就像一个魅力。我知道这与组有关,但正如我对 mongo 真正了解的那样,我不知道各种聚合运算符及其用法。
    猜你喜欢
    • 2020-08-22
    • 2018-07-14
    • 1970-01-01
    • 2018-12-24
    • 2020-11-14
    • 2021-12-13
    • 2019-05-20
    • 1970-01-01
    • 2017-07-31
    相关资源
    最近更新 更多