Trabajando con Nodejs y MongoDB mediante el controlador nativo MongoDB de Nodo. Necesita recuperar algunos documentos y hacer modificaciones, luego guárdelos nuevamente. Este es un ejemplo:Cuándo cerrar la conexión de la base de datos MongoDB en Nodejs
db.open(function (err, db) {
db.collection('foo', function (err, collection) {
var cursor = collection.find({});
cursor.each(function (err, doc) {
if (doc != null) {
doc.newkey = 'foo'; // Make some changes
db.save(doc); // Update the document
} else {
db.close(); // Closing the connection
}
});
});
});
Con carácter asíncrono, si el proceso de actualización del documento lleva más tiempo, a continuación, cuando el cursor llega al final de los documentos, con base de datos se cierra. No todas las actualizaciones se guardan en la base de datos.
Si se omite el db.close()
, todos los documentos se actualizan correctamente, pero la aplicación se bloquea, nunca se cierra.
Vi una publicación sugiriendo usar un contador para rastrear el número de actualizaciones, cuando vuelva a cero, luego cierre el db. ¿Pero estoy haciendo algo mal aquí? ¿Cuál es la mejor manera de manejar este tipo de situación? ¿Se debe usar db.close()
para liberar recursos? ¿O debe abrirse una nueva conexión db?
@realguess, también existen librerías para utilidades de concurrencia que pueden ayudarle a hacer esto por lo que no tiene que manejar los detalles. echa un vistazo a async.js, por ejemplo, https://github.com/caolan/async – mpobrien
@mpobrien, ¿podrías dar más detalles sobre cómo usar la función asincrónica para resolver este problema? –
¿Crees que estas soluciones aún se mantienen en 2017 o conoces algo mejor? Estaba pensando en algo como esto, pero ¿y si la función en 'cursor.each (función (err, doc) {' llama a una función asíncrona, que ejecutaría lógica en una devolución de llamada y posiblemente necesitaría la base de datos después de 'cada() '¿termina? ¿Y qué pasa si después de los cambios posteriores en el software, esa devolución de llamada llama a otra función asíncrona (espero que entiendas la idea)? – watery