Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

403
Visualizações
MongoDB: consulta agregada para sumar el campo de duración

Tengo un conjunto de registros desde donde necesito resumir la duración para que se muestre

Registros

 [{ id:"1", duration:"07:30:00" }, { id:"1", duration:"07:30:00" } { id:"2", duration:"07:30:00" }]

Producción

 [{ _id: 1, totalDuration: "15:00" },{ _id: 2, totalDuration: "07:30" }]
over 4 years ago · Santiago Trujillo
3 Respostas
Responde à pergunta

0

A partir de la versión de MongoDB >= 4.4, puede usar el operador de función $ para definir funciones personalizadas para implementar un comportamiento no compatible con el lenguaje de consulta de MongoDB. La lógica para agregar dos datos de tiempo en formato HH:MM:SS se toma de aquí .

Así que prueba esta consulta:

 db.testCollection.aggregate([ { $group: { _id: "$id", times: { $push: "$duration" } } }, { $project: { _id: 1, totalDuration: { $function: { body: function(times) { let hours = 0; let minutes = 0; let seconds = 0; for (let i = 0; i < times.length; i++) { let values = times[i].split(":"); hours += parseInt(values[0]); minutes += parseInt(values[1]); seconds += parseInt(values[2]); } let realHrs = hours + Math.floor(minutes / 60); let realMins = (minutes % 60) + Math.floor(seconds / 60); let realSecs = seconds % 60; return realHrs + ":" + realMins + ":" + realSecs }, args: ["$times"], lang: "js" } } } }, { $sort: { _id: 1 } } ]);

Producción

 /* 1 */ { "_id" : "1", "totalDuration" : "15:6:12" }, /* 2 */ { "_id" : "2", "totalDuration" : "7:30:0" }

Datos en la colección testCollection :

 { "_id" : ObjectId("..."), "id" : "1", "duration" : "07:30:30" }, { "_id" : ObjectId("..."), "id" : "1", "duration" : "07:35:42" }, { "_id" : ObjectId("..."), "id" : "2", "duration" : "07:30:00" }
over 4 years ago · Santiago Trujillo Relatório

0

No hay una forma directa de hacer esto en mongodb. Puede usar el operador de función $ a partir de MongoDB v4.4, puede escribir una lógica personalizada en la sintaxis JS.


Segunda opción, puede hacer una lógica personalizada usando operadores aritméticos mongodb,

  • $split para dividir la cadena de duración usando ":" en la matriz y establecerlo en la variable de time en $let
  • $arrayElemAt para obtener un elemento específico de la matriz, estamos tomando la hour y minute desde la posición 0 y 1
  • $toInt para convertir cadena a entero
  • verifique la condición si el minuto es 00 , luego regrese o de lo contrario 0.5
  • $add a la suma de hour y minute
  • $group por id y duration de la suma
 db.collection.aggregate([ { $addFields: { duration: { $let: { vars: { time: { $split: ["$duration", ":"] } }, in: { $add: [ { $toInt: { $arrayElemAt: ["$$time", 0] } }, { $cond: [ { $eq: [{ $arrayElemAt: ["$$time", 1] }, "00"] }, 0, 0.5 ] } ] } } } } }, { $group: { _id: "$id", duration: { $sum: "$duration" } } } ])

Patio de recreo

La consulta resultará:

 [ { "_id": "1", "duration": 15 }, { "_id": "2", "duration": 7.5 } ]
over 4 years ago · Santiago Trujillo Relatório

0

Otra solución podría ser esta:

 db.collection.aggregate([ { $addFields: { duration: { $let: { vars: { time: { $split: ["$duration", ":"] } }, in: { $dateFromParts: { year: 1970, month: 1, day: 1, hour: { $toInt: { $arrayElemAt: ["$$time", 0] } }, minute: { $toInt: { $arrayElemAt: ["$$time", 1] } }, second: { $toInt: { $arrayElemAt: ["$$time", 2] } } } } } } } }, { $group: { _id: "$id", duration: { $sum: { $toLong: "$duration" } } } }, { $set: { duration: { $dateToString: { date: { $dateFromParts: { year: 1970, month: 1, day: 1, millisecond: "$duration" } }, format: "%H:%M:%S" } } } } ])

Sin embargo, si la duración es superior a 24 horas, ya no funciona. Pero puede agregar { $dayOfYear: <dateExpression> } a la salida, luego la duración puede llegar a un año.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda