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

118
Visualizações
Encuentre el valor más alto en MongoDB

tengo coleccion - canciones

Necesito encontrar la canción más larga, pero la duración de la canción viene en dos formatos: segundos y HH:MM:SS.

 { "_id": "61179c8d43400f31df195223", "name": "song1", "time": 2000 }, { "_id": "61179c8341f00f31df159223", "name": "song2", "time": "00:34:16" }, { "_id": "61179c8341f00f31df195223", "name": "song3", "time": 2800 }, { "_id": "61179c8380f00f31df195223", "name": "song4", "time": "00:01:10" } ,{ "_id": "61179c8310f00f31df195223", "name": "song5", "time": "00:15:10" }
over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

Consulta

  • agrega un nuevo campo timeSec, para almacenar el tiempo en segundos
  • si el tiempo no es una cadena, mantenemos el tiempo (ya está en segundos)
  • demás
  • divide la cadena en partes, por ejemplo [1, 2, 10]
  • $comprimir las partes con sus multiplicadores [[1 3600] [2 60] [10 1]] (1 hora = 3600 segundos, etc.)
  • reducir a suma después de multiplicar los miembros de la matriz

* si está anidado mucho, puede anidarlo usando más campos temporales para que sea más legible.

Código de prueba aquí

 aggregate( [{$set: {timeSec: {$cond: [{$eq:[{$type:"$time"}, "string"]}, {$reduce: {input: {$zip:{inputs:[{$split:["$time", ":"]}, [3600, 60, 1]]}}, initialValue:0, in: {$add: ["$$value", {$multiply: [{$toInt:{$arrayElemAt:["$$this", 0]}}, {$arrayElemAt:["$$this", 1]}]}]}}}, "$time"]}}}, {$sort:{timeSec:-1}}, {$limit:1}])
over 4 years ago · Santiago Trujillo Relatório

0

No hay una forma directa de hacer esto, puede probar la canalización de agregación,

  • $addFields para agregar o editar un campo
  • $cond para verificar es el número de campo de time usando $isNumber si es así, luego devuelva la time actual; de lo contrario, vaya a otra parte
  • $let para crear time variable en memoria después de dividirlo usando $split by ":"
  • $arrayElemAt para obtener el formulario de elemento específico sobre la matriz dividida
  • $toInt para convertir números divididos en enteros
  • $multiply para multiplicar horas, minutos a un número específico para convertirlo en segundos
  • $sum para obtener el total de segundos
  • $sort por time en orden descendente
  • $limit para obtener el primer documento
 db.collection.aggregate([ { $addFields: { time: { $cond: [ { $isNumber: "$time" }, "$time", { $let: { vars: { time: { $split: ["$time", ":"] } }, in: { $sum: [ { $multiply: [ { $toInt: { $arrayElemAt: ["$$time", 0] } }, 3600 ] }, { $multiply: [ { $toInt: { $arrayElemAt: ["$$time", 1] } }, 60 ] }, { $toInt: { $arrayElemAt: ["$$time", 2] } } ] } } } ] } } }, { $sort: { time: -1 } }, { $limit: 1 } ])

Patio de recreo

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