首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Mongo聚合$project变量作为字段名

Mongo聚合$project变量作为字段名
EN

Stack Overflow用户
提问于 2020-12-07 07:26:57
回答 1查看 918关注 0票数 2

Mongo4.2

拥有一堆用于服务器实例和CPU使用的数据。

代码语言:javascript
复制
{
    "_id" : "1",
    "instance" : "172.00.00.01",
    "client" : "A",
    "date" : ISODate("2020-12-06T22:47:00.163Z"),
    "app" : 0.0133317
}

{
    "_id" : "2",
    "instance" : "172.00.00.01",
    "client" : "A",
    "date" : ISODate("2020-12-06T22:47:03.163Z"),
    "app" : 0.0400000
}

{
    "_id" : "3",
    "instance" : "172.00.00.02",
    "client" : "B",
    "date" : ISODate("2020-12-06T22:47:00.163Z"),
    "app" : 0.0800000
}

我希望这是我的结果,数据按分钟分组,然后用MAX "app“值为每个实例进行字段。

代码语言:javascript
复制
{
    "_id" : {
        "minute" : 47,
        "hour" : 22,
        "day" : 6,
        "month" : 12,
        "year" : 2020
    },
    "172.00.00.01": 0.0400000,
    "172.00.00.02": 0.0800000
}

所以我的汇总需要分组才能得到会议记录:

代码语言:javascript
复制
{
    "$group": {
      "_id": {
        "minute": {
          "$minute": {
            "date": "$date",
            "timezone": "America/Chicago"
          }
        },
        "hour": {
          "$hour": {
            "date": "$date",
            "timezone": "America/Chicago"
          }
        },
        "day": {
          "$dayOfMonth": {
            "date": "$date",
            "timezone": "America/Chicago"
          }
        },
        "month": {
          "$month": {
            "date": "$date",
            "timezone": "America/Chicago"
          }
        },
        "year": {
          "$year": {
            "date": "$date",
            "timezone": "America/Chicago"
          }
        },
        instance: '$instance',
        client: '$client'
      },
      app: {
          $max: '$app'
      }
    }
  }

这条管道给我的结果是:

代码语言:javascript
复制
{
    "_id" : {
        "minute" : 47,
        "hour" : 22,
        "day" : 6,
        "month" : 12,
        "year" : 2020,
        "instance" : "172.00.00.01",
        "client" : "A"
    },
    "app" : 0.040000
},
{
    "_id" : {
        "minute" : 47,
        "hour" : 22,
        "day" : 6,
        "month" : 12,
        "year" : 2020,
        "instance" : "172.00.00.02",
        "client" : "B"
    },
    "app" : 0.080000
}

因此,要获得所需的输出,我知道我需要在没有实例/客户端的情况下再次分组来组合这两者,但是如何动态地将实例变量作为字段名呢?这些不管用!

代码语言:javascript
复制
{
    "$addFields": {
      "[$instance]": "$app"
    }
},

{
    "$addFields": {
      "[$$instance]": "$app"
    }
},

{
    "$addFields": {
      "$instance": "$app"
    }
},

{
    "$addFields": {
      "$$instance": "$app"
    }
},
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-07 07:57:40

使用您的代码,另外

代码语言:javascript
复制
{
    $group: {
      _id: {
        day: "$_id.day",
        hour: "$_id.hour",
        minute: "$_id.minute",
        month: "$_id.month",
        "year": "$_id.year"
      },
      data: {
        $push: { k: "$_id.instance", v: "$app" }
      }
    }
  },
  {
    $addFields: {
      data: { "$arrayToObject": "$data" }
    }
  },
  {
    "$replaceRoot": {
      "newRoot": {
        "$mergeObjects": [ "$data", "$$ROOT" ]
      }
    }
  },
  {
    $project: {
      data: 0
    }
  }

Working 蒙戈游乐场

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65177576

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档