Mongodb收集对象总小时数收集

Mongodb收集对象总小时数收集,mongodb,mongoose,Mongodb,Mongoose,mongodb收集数据(感谢advance) 我们需要像总持续时间小时这样的输出来计算上述三个对象的持续时间小时:((09:30)+(09:30)+(09:30)), 输出应该是这样的总持续时间小时数:28小时:30分钟我建议您在模式中将持续时间设置为数字字段,并将分钟数存储在其中,这样就可以使用简单的聚合查询轻松地计算和求和所有字段 但是,如果您无法更改它,并且希望使用当前模式获得答案,您可以尝试下面的聚合,尽管我不能保证性能,但由于使用了许多聚合阶段和运算符,因此可能会比较慢 试试这个: d

mongodb收集数据(感谢advance)

我们需要像总持续时间小时这样的输出来计算上述三个对象的持续时间小时:((09:30)+(09:30)+(09:30)),
输出应该是这样的总持续时间小时数:28小时:30分钟

我建议您在模式中将
持续时间
设置为数字字段,并将分钟数存储在其中,这样就可以使用简单的聚合查询轻松地计算和求和所有字段

但是,如果您无法更改它,并且希望使用当前模式获得答案,您可以尝试下面的聚合,尽管我不能保证性能,但由于使用了许多聚合阶段和运算符,因此可能会比较慢

试试这个:

db.collection.aggregate([
  {
    $project: {
      time: {
        $split: [
          "$durationHrs",
          ":"
        ]
      }
    }
  },
  {
    "$project": {
      totalTime: {
        $sum: [
          {
            "$multiply": [
              {
                "$toInt": {
                  "$arrayElemAt": [
                    "$time",
                    0
                  ]
                }
              },
              60
            ]
          },
          {
            "$toInt": {
              "$arrayElemAt": [
                "$time",
                1
              ]
            }
          }
        ]
      }
    }
  },
  {
    $group: {
      _id: null,
      durationHrs: {
        $sum: "$totalTime"
      }
    }
  },
  {
    $project: {
      durationHrs: {
        "$concat": [
          {
            "$toString": {
              $toInt: {
                "$divide": [
                  "$durationHrs",
                  60
                ]
              }
            }
          },
          ":",
          {
            "$toString": {
              $mod: [
                "$durationHrs",
                60
              ]
            }
          }
        ]
      }
    }
  }
])
聚合管道的概要是,您将持续时间拆分,将其转换为分钟,添加分钟,然后再转换回所需的格式

结果将是:

[
  {
    "_id": null,
    "durationHrs": "28:30"
  }
]
您可以在上玩查询


您可以在

中阅读查询中使用的所有运算符。我的建议如下:

db.collection.aggregate([
   {
      $addFields: {
         duration: {
            $toLong: {
               $dateFromParts: {
                  year: 1970,
                  hour: { $toInt: { $first: { $split: ["$durationHrs", ":"] } } },
                  minute: { $toInt: { $last: { $split: ["$durationHrs", ":"] } } },
               }
            }
         }
      }
   },
   { $group: { _id: null, durations: { $sum: "$duration" } } },
   {
      $set: {
         h: {
            $toInt: {
               $sum: [{
                  $multiply: [
                     { $dayOfYear: { $toDate: "$durations" } }, 24]
               },
               -24,
               { $hour: { $toDate: "$durations" } }]
            }
         },
         m: { $minute: { $toDate: "$durations" } }
      }
   },
   { $project: { durations: { $concat: [{ $toString: "$h" }, ":", { $toString: "$m" }] } } }
])

请注意,它只在长达一年的时间内有效,即366天。

谢谢您的建议,我必须尝试这种方法。1小时30分钟在计算后存储为90分钟,以分贝为单位,然后转换为正常的HH:MM此格式我是正确的?以上您所说的方法工作正常。在集合中,我需要特定的员工总持续时间小时数。请检查mongodb Playder
db.collection.aggregate([{$group:{{u id:$employeeId],totalduration:{$sum:$durationHrs},employeeId:{$first:$employeeId}}}])
在这种情况下应该可以工作
db.collection.aggregate([
   {
      $addFields: {
         duration: {
            $toLong: {
               $dateFromParts: {
                  year: 1970,
                  hour: { $toInt: { $first: { $split: ["$durationHrs", ":"] } } },
                  minute: { $toInt: { $last: { $split: ["$durationHrs", ":"] } } },
               }
            }
         }
      }
   },
   { $group: { _id: null, durations: { $sum: "$duration" } } },
   {
      $set: {
         h: {
            $toInt: {
               $sum: [{
                  $multiply: [
                     { $dayOfYear: { $toDate: "$durations" } }, 24]
               },
               -24,
               { $hour: { $toDate: "$durations" } }]
            }
         },
         m: { $minute: { $toDate: "$durations" } }
      }
   },
   { $project: { durations: { $concat: [{ $toString: "$h" }, ":", { $toString: "$m" }] } } }
])