如何在查询中编写单个聚合

Posted

技术标签:

【中文标题】如何在查询中编写单个聚合【英文标题】:how to write the single aggregation in the query 【发布时间】:2018-08-29 05:22:36 【问题描述】:

我正在编写大于等于 CREATE_DATE 并且小于 CREATE_DATE 的第一个查询我得到的答案是计算持续时间编写另一个查询但是如何在聚合中编写单个查询。

查询 1

db.lights.aggregate(
  $match: 
    CREATE_DATE: 
      $gte: ISODate("2018-01-24T20:05:30.000Z"),
      $lt: ISODate("2018-02-24T20:05:30.000Z")
    
  
);

结果


  "_id": ObjectId("5a9a74843711955836a8b4b5"),
  "SWITCHID": "Z4-W40-SS451A/4",
  "CREATE_DATE": ISODate("2018-01-24T20:05:30Z"),
  "RECEIVEDDATE": ISODate("2018-02-24T20:05:45Z"),
  "STATUS": "LIGHTS ON"

查询 2

db.lights.aggregate([
  
    $addFields: 
      offduration: 
        $divide: [
          
            $subtract: [
              "$RECEIVEDDATE",
              "$CREATE_DATE"
            ]
          ,
          3600000
        ]
      
    
  
]);

结果


  "_id": ObjectId("5a9a75af3711955836a8b4c8"),
  "SWITCHID": "Z4-W40-SS451A/5",
  "CREATE_DATE": ISODate("2018-02-24T20:05:30Z"),
  "RECEIVEDDATE": ISODate("2018-02-24T20:05:45Z"),
  "STATUS": "LIGHTS ON",
  "offduration": 0.004166666666666667

【问题讨论】:

您不能组合这两个查询,因为它们会产生不同的数据。如果将它们结合起来,您将不会得到任何结果。请调整您的数据范围并使用db.lights.aggregate([ $match: CREATE_DATE : $gte: ISODate("2018-01-24T20:05:30.000Z"), $lte: ISODate("2018-02-24T20:05:30.000Z") ,$addFields: duration: $divide: [$subtract: ["$RECEIVEDDATE", "$CREATE_DATE"], 3600000] ]) 【参考方案1】:

您需要像这样改进您的查询:

db.lights.aggregate(
  $match: 
  CREATE_DATE: 
    $gte: ISODate("2018-01-24T20:05:30.000Z"),
    $lt: ISODate("2018-02-24T20:05:30.000Z")
    
  
,
 
  $addFields: 
    offduration: 
      $divide: [
        
          $subtract: [
            "$RECEIVEDDATE",
            "$CREATE_DATE"
          ]
        ,
        3600000
      ]
    
  
,

$project: 
  _id: 1,
  SWITCHID: 1,
  CREATE_DATE: 1,
  RECEIVEDDATE: 1,
  STATUS: 1,
  offduration: '$offduration',
  avgduration:  $avg: "$offduration"       
 
);

【讨论】:

完美....我得到的输出是 "_id" : ObjectId("5a9a74843711955836a8b4b5"), "SWITCHID" : "Z4-W40-SS451A/4", "CREATE_DATE" : ISODate (“2018-01-24T20:05:30Z”),“RECEIVEDDATE”:ISODate(“2018-02-24T20:05:45Z”),“STATUS”:“LIGHTS ON”,“offduration”:744.0041666666667 我有一个问题 Z4-W40-SS451A/4 相同的 SWITCHID 号码那里如何计算平均关闭时间请帮我先生... 你需要在 mongodb 文档中查看$avg @Neel Rathod iam 使用 $ avg 但未获取所有字段输出:“_id”:“SWITCHID”:“Z4-W40-SS451A/10”,“STATUS”:“LIGHTS OFF” , "avgduration" : 0.03333333333333333 "_id" : "SWITCHID" : "Z4-W40-SS451A/5", "STATUS" : "LIGHTS ON" , "avgduration" : 202.50562416666668 @Neel Rathod 我在之前的聚合中添加了这个聚合 "$group" : _id: SWITCHID: "$SWITCHID", STATUS: "$STATUS" , avgduration: $avg : "$offduration"

以上是关于如何在查询中编写单个聚合的主要内容,如果未能解决你的问题,请参考以下文章

如何使用单个 SQL 聚合函数查询为同一个聚合函数获取多个结果?

如何在 oracle 数据库中为具有复杂聚合的数据透视编写等效的 sql 查询?

如何在单个过程中编写多个选择查询?

如何编写查询以避免在 select distinct 和 size collect_set hive 查询中使用单个 reducer?

如何使用蒙德里安聚合单个维度的多个层次结构?

如何编写带有联接和聚合的 SQLAlchemy 查询?