2
{ 
"_id" : ObjectId("58f5a22d22679039176d2ee8"), 
"MachineID" : NumberInt("1001"), 
"Timestamp" : ISODate("2017-04-18T07:01:01.000+05:30"), 
"Utilization" : NumberInt("63654480"), 
"RunStatus" : NumberInt("1"), 
"ProductsCount" : NumberInt("681350") 
}, 
{ 
"_id" : ObjectId("58f5a22d22679039176d2ee9"), 
"MachineID" : NumberInt("1001"), 
"Timestamp" : ISODate("2017-04-18T07:02:02.000+05:30"), 
"Utilization" : NumberInt("63655480"), 
"RunStatus" : NumberInt("1"), 
"ProductsCount" : NumberInt("681370") 
}, 
{ 
"_id" : ObjectId("58f5a22d22679039176d2eea"), 
"MachineID" : NumberInt("1001"), 
"Timestamp" : ISODate("2017-04-18T07:03:02.000+05:30"), 
"Utilization" : NumberInt("63656480"), 
"RunStatus" : NumberInt("0"), 
"ProductsCount" : NumberInt("681390") 
}, 
{ 
"_id" : ObjectId("58f5a22d22679039176d2eeb"), 
"MachineID" : NumberInt("1001"), 
"Timestamp" : ISODate("2017-04-18T07:04:02.000+05:30"), 
"Utilization" : NumberInt("63657480"), 
"RunStatus" : NumberInt("1"), 
"ProductsCount" : NumberInt("681420") 
}, 
{ 
"_id" : ObjectId("58f5a22d22679039176d2eec"), 
"MachineID" : NumberInt("1001"), 
"Timestamp" : ISODate("2017-04-18T07:05:02.000+05:30"), 
"Utilization" : NumberInt("63658480"), 
"RunStatus" : NumberInt("1"), 
"ProductsCount" : NumberInt("681450"), 
}, 
{ 
"_id" : ObjectId("58f5a22d22679039176d2eed"), 
"MachineID" : NumberInt("1001"), 
"Timestamp" : ISODate("2017-04-18T07:06:02.000+05:30"), 
"Utilization" : NumberInt("63659480"), 
"RunStatus" : NumberInt("1"), 
"ProductsCount" : NumberInt("681470") 
}, 
{ 
"_id" : ObjectId("58f5a22d22679039176d2eee"), 
"MachineID" : NumberInt("1001"), 
"Timestamp" : ISODate("2017-04-18T07:07:02.000+05:30"), 
"Utilization" : NumberInt("63659780"), 
"RunStatus" : NumberInt("0"), 
"ProductsCount" : NumberInt("681490") 
}, 
{ 
"_id" : ObjectId("58f5a22d22679039176d2eef"), 
"MachineID" : NumberInt("1001"), 
"Timestamp" : ISODate("2017-04-18T07:08:03.000+05:30"), 
"Utilization" : NumberInt("63659880"), 
"RunStatus" : NumberInt("1"), 
"ProductsCount" : NumberInt("681525") 
}, 
{ 
"_id" : ObjectId("58f5a22d22679039176d2ef0"), 
"MachineID" : NumberInt("1001"), 
"Timestamp" : ISODate("2017-04-18T07:09:03.000+05:30"), 
"Utilization" : NumberInt("63659980"), 
"RunStatus" : ("0"), 
"ProductsCount" : NumberInt("681563") 
} 

的分组从上述收集,利用ProductsCount是累积值和增量随着时间的推移。MongoDB的聚合查询和减去累积值

需要减去当前行的利用与下一行的利用这是按升序排序。以及相同的操作产品总数根据运行状态

如果当前行的RunStatus是1,下一行是0,则在利用ProductsCount的差应该被映射到下一行的RunStatus是0

然后组它基于机号RunStatus

预期结果

/* 1 */ 
{ 
"MachineID" : 1001, 
"RunStatus" : 1, 
"Utilization" : 4100, 
"ProducedCount" : 135 
}, 

/* 2 */ 
{ 
"MachineID" : NumberInt("1001"), 
"RunStatus" : NumberInt("0"), 
"Utilization" : 1400, 
"ProducedCount" : 78 
} 

聚合框架中需要结果。请帮忙。

这是我尝试过,

db.collection.aggregate([ 
{ "$match" : { "$and" : [ { "MachineID" : { "$in" : [ 1001]}} , 
    { "Timestamp" : { "$gte" : ISODate("2017-04-18T01:30:00.000Z"), 
    "$lte" : ISODate("2017-04-19T01:30:00.000Z")}},]} 
}, 
{ 
    "$addFields": {"lastUtilization": 0} 
}, 
{ 
    "$addFields": {"lastProductsCount" : 0} 
}, 
{ 
    "$group": { 
     "_id": 
     { 
      MachineID : '$MachineID', 
      "RunStatus": "$RunStatus" 
     }, 
     "Utilization" : 
     { 
      "$sum" : 
      { 
       "$cond": [ 
         { "$ne": [ "$lastUtilization", 0 ] }, 
         {"$subtract" : ["$Utilization", 
"$lastUtilization"]}, 0 
        ] 
      } 
     }, 
     "ProductsCount" : 
     { 
      "$sum" : 
      { 
       "$cond": [ 
         { "$ne": [ "$lastProductsCount", 0 ] }, 
         {"$subtract" : ["$ProductsCount", 
"$lastProductsCount"]}, 0 
        ] 
      } 
     }, 
     "lastProductsCount" : { "$avg" : "$ProductsCount"}, 
     "lastUtilization" : { "$avg" : "$Utilization"} 
} 
}, 
{ 
    "$project": 
    { 
     "MachineID": "$_id.MachineID", 
     "RunStatus" : "$_id.RunStatus", 
     "Utilization" : "$Utilization", 
     "ProductsCount" : "$ProductsCount" 
    } 
}, 
]); 

回答

4

这个怎么样?它不会计算小时,但它会完成所有其他操作。

[ 
    { 
     $match: { 
      $and: [ 
       {MachineID: {$in: [1001]}}, 
       { 
       Timestamp: { 
        $gte: ISODate("2017-04-18T01:30:00.000Z"), 
        $lte: ISODate("2017-04-19T01:30:00.000Z") 
       } 
       } 
      ] 
     } 
    }, 
    // Add all data to one array. 
    {$group: {_id: "$MachineID", all: {$push: "$$ROOT"}}}, 
    // Create an array of (element, array index) pairs. 
    {$addFields: {allWithIndex: {$zip: {inputs: ["$all", {$range: [0, {$size: "$all"}]}]}}}}, 
    // Create an array of {current: <element>, previous: <previous element>} pairs. 
    { 
     $project: { 
      pairs: { 
       $map: { 
        input: "$allWithIndex", 
        in : { 
         current: {$arrayElemAt: ["$$this", 0]}, 
         prev: { 
          $arrayElemAt: [ 
           "$all", 
           // Set prev == current for the first element. 
           {$max: [0, {$subtract: [{$arrayElemAt: ["$$this", 1]}, 1]}]} 
          ] 
         } 
        } 
       } 
      } 
     } 
    }, 
    // Compute the deltas. 
    {$unwind: "$pairs"}, 
    { 
     $group: { 
      _id: {MachineID: "$_id", RunStatus: "$pairs.current.RunStatus"}, 
      ProductsCount: 
       {$sum: {$subtract: ["$pairs.current.ProductsCount", "$pairs.prev.ProductsCount"]}}, 
      Utilization: 
       {$sum: {$subtract: ["$pairs.current.Utilization", "$pairs.prev.Utilization"]}}, 
     } 
    } 
] 
+0

查理斯旺森的奇妙的东西。很棒的作品.. !!! – user2114103