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" }Consulta
[1, 2, 10][[1 3600] [2 60] [10 1]] (1 hora = 3600 segundos, etc.)* si está anidado mucho, puede anidarlo usando más campos temporales para que sea más legible.
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}])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 } ])