Quiero eliminar un documento automáticamente después de 10 segundos de crearlo, para hacer esto uso mongodb TTL, pero el temporizador no funciona correctamente y elimina el documento después de 40 segundos o 50 segundos o 20, entonces, ¿dónde está mi error?
await db.collection("admin_msg").insertOne({ createdAt: new Date() }); await db.collection("admin_msg").createIndex({ createdAt: 1}, { expireAfterSeconds: 10 });Como dice la documentación de mongo :
La tarea en segundo plano que elimina los documentos caducados se ejecuta cada 60 segundos. Como resultado, los documentos pueden permanecer en una colección durante el período entre el vencimiento del documento y la ejecución de la tarea en segundo plano.
Entonces, si el documento debe eliminarse exactamente después de 10 segundos, tendrá que escribir su propio servicio, trabajo u otro método programable para eliminar un documento después de un período de tiempo específico.
expireAfterSeconds no garantiza la eliminación inmediata del documento. Las eliminaciones se realizan mediante un trabajo en segundo plano que se ejecuta cada minuto. Este trabajo es de baja prioridad y MongoDB puede posponerlo cuando la carga actual es alta. Entonces, cuando es importante para su caso de uso que los tiempos de vencimiento se respeten con precisión al segundo, entonces debe agregar el tiempo de vencimiento a la consulta de búsqueda para asegurarse de que no obtenga ningún documento que ya se suponga que debe eliminarse.
Esta característica está documentada aquí: http://docs.mongodb.org/manual/tutorial/expire-data/
No recomendaría crear un trabajo propio para eliminar automáticamente documentos y ejecutarlos en intervalos más cortos, ya que eso no solo podría causar una gran carga, sino que también podría no solucionar el problema, porque esas eliminaciones también podrían retrasarse cuando el oplog se hace demasiado largo Verificar el vencimiento en la recuperación es una opción mucho más confiable.