有没有一种方法可以动态设置MongoDB查询中的字段值?

时间:2020-08-04 07:52:39

标签: node.js mongodb mongodb-query

我正在运行MongoDB查询,并尝试更改输出的结构方式。当前看起来如下:

[
  {
    qClass: [
      {
        cat: 'Servers',
        class: 'High Impact Maintenance',
        total: 1
      },
      {
        cat: 'Network.TrafficShapers',
        class: 'Maintenance',
        total: 16
      },
      {
        cat: 'Network.Hop',
        class: 'Core Failure',
        total: 2
      },
      {
        cat: 'Office.MFD',
        class: 'Failure',
        total: 4
      },
      {
        cat: 'Office.Printers',
        class: 'Maintenance',
        total: 36
      },
      {
        cat: 'Office.MFD',
        class: 'Maintenance',
        total: 880
      },
      {
        cat: 'Network.TrafficShapers',
        class: 'Failure',
        total: 47
      },
      {
        cat: 'Servers',
        class: 'Core Maintenance',
        total: 1
      },
      {
        cat: 'Network.Switches',
        class: 'Failure',
        total: 5
      },
      {
        cat: 'Servers',
        class: 'Performance',
        total: 21
      },
      {
        cat: 'Network.Switches',
        class: 'High Impact Failure',
        total: 4
      },
      {
        cat: 'Network.Firewall',
        class: 'Core Failure',
        total: 2
      },
      {
        cat: 'Network.Router',
        class: 'Failure',
        total: 53
      },
      {
        cat: 'Servers',
        class: 'High Impact Failure',
        total: 3
      },
      {
        cat: 'Office.Printers',
        class: 'Performance',
        total: 1
      },
      {
        cat: 'Network.TrafficShapers',
        class: 'Performance',
        total: 3
      },
      {
        cat: 'Network.Switches',
        class: 'Maintenance',
        total: 1
      },
      {
        cat: 'Servers',
        class: 'Failure',
        total: 60
      },
      {
        cat: 'Network.Router',
        class: 'Performance',
        total: 67
      },
      {
        cat: 'Network.Router',
        class: 'High Impact Failure',
        total: 39
      },
      {
        cat: 'Office.MFD',
        class: 'Performance',
        total: 5
      },
      {
        cat: 'Network.TrafficShapers',
        class: 'High Impact Failure',
        total: 593
      },
      {
        cat: 'Network.Router',
        class: 'Maintenance',
        total: 78
      },
      {
        cat: 'Office.Printers',
        class: 'High Impact Failure',
        total: 2
      },
      {
        cat: 'Office.Printers',
        class: 'Failure',
        total: 1
      },
      {
        cat: 'Office.MFD',
        class: 'Critical Failure',
        total: 48
      }
    ]
  }
] 

我希望它的结构如下:

{
    cat: 'Servers',
    High Impact Maintenance: 1,
    Performance: 24,
   Total: 25
} 

因此,基本上,关于cat(category)的所有信息都在同一数组中,并且字段名称对于该类是动态的。下面是我为此使用的查询:

db.full_ticket_lists.aggregate(
  {
    
    $facet: {
            qClass: [
          {$match : {"device":{$ne:null},"status":"Open","ticket_class":{$ne:''}}},
          {$lookup: { from: "devices", localField: "device",  foreignField: "_id", as: "device_link"},},
          {$lookup: { from: "device_categories", localField: "device_link.device_category",  foreignField: "_id", as: "category_link"},},
          {$unwind: "$category_link"},
          {$group : {
                      _id:{"class_name":"$ticket_class", "cat_name":"$category_link.name"}, 
                      count: {$sum:1}
          },},
          {$project:{_id:0,cat:"$_id.cat_name", class:"$_id.class_name",total:"$count"}}
      ],
    }
  }
) 

1 个答案:

答案 0 :(得分:0)

逐步查看,关注您的预期结果,

i
  • { "cat": 'Servers', "High Impact Maintenance": 1, "Performance": 24, "Total": 25 } $unwind,因为它是一个数组,我们需要$ group部分下面的每个对象
  • qClass$group
  • 创建cat以将classes推为k(键),将class推为v(值)
  • 创建total来推送所有total的总和
total
  • $replaceRoot将用新数组替换根
  • $mergeObjects将合并两个对象,第一个db.collection.aggregate([ { $unwind: "$qClass" }, { $group: { _id: "$qClass.cat", cat: { $first: "$qClass.cat" }, classes: { $push: { k: "$qClass.class", v: "$qClass.total" } }, total: { $sum: "$qClass.total" } } }, 和第二个$$ROOT从数组转换为对象
  • $arrayToObject$classes数组转换为对象,并将k(key)和v(value)转换为对象
classes
  • { $replaceRoot: { newRoot: { $mergeObjects: [ "$$ROOT", { $arrayToObject: "$classes" } ] } } }, 将隐藏不需要的字段(0 =隐藏,1 =显示),因此这里$project_id被隐藏了,两者都不再需要< / li>
classes

游乐场:https://mongoplayground.net/p/vyGaHfXWJ0z