Nuevo en MongoDB, muy nuevo en Atlas. Estoy tratando de configurar un disparador para que lea todos los datos de una colección llamada Config . Este es mi intento:
exports = function(changeEvent) { const mongodb = context.services.get("Cluster0"); const db = mongodb.db("TestDB"); var collection = db.collection("Config"); config_docs = collection.find().toArray(); console.log(JSON.stringify(config_docs)); } la función es parte de una aplicación de dominio creada automáticamente llamada Triggers_RealmApp , que tiene Cluster0 como fuente de datos vinculada con nombre. Cuando entro en Colecciones en Cluster0, TestDB.Config es una de las colecciones.
Algunas notas:
{} .context.services.get("Cluster0"); a otra cosa, arroja un error"TestDB" a una base de datos que no existe, o "Config" a una colección que no existe, obtengo el mismo resultado; {}Terminé tomándolo directamente con MongoDB, .find() es asíncrono y lo estaba manejando incorrectamente. Aquí está la respuesta directamente de la boca de los caballos:
Según tengo entendido, no está obteniendo los resultados esperados de la consulta que publicó anteriormente. ¡Sé que puede ser confuso cuando recién está comenzando con una nueva tecnología y no puede hacer que algo funcione!
El problema es que la función collection.find() es una función asíncrona. Eso significa que envía la solicitud pero no espera la respuesta antes de continuar. En su lugar, devuelve una Promesa, que es un objeto que describe el estado actual de la operación. Dado que una Promesa realmente no es una matriz, su declaración collection.find().toArray() está devolviendo un objeto vacío. Escribe este objeto vacío en console.log y finaliza su función, probablemente antes de que la llamada asíncrona incluso regrese con sus datos.
Hay un par de maneras de lidiar con esto. La primera es hacer que su función sea asíncrona y usar el operador await para decirle a su función que espere a que la función collection.find() regrese antes de continuar.
exports = async function(changeEvent) { const mongodb = context.services.get("Cluster0"); const db = mongodb.db("TestDB"); var collection = db.collection("Config"); config_docs = await collection.find().toArray(); console.log(JSON.stringify(config_docs)); };Observe la palabra clave async en la primera línea y la palabra clave await en la penúltima línea.
El segundo método es usar la función .then para procesar los resultados cuando regresen:
exports = function(changeEvent) { const mongodb = context.services.get("Cluster0"); const db = mongodb.db("TestDB"); var collection = db.collection("Config"); collection.find().toArray().then(config_docs => { console.log(JSON.stringify(config_docs)); }); };La conexión debe ser una conexión al conjunto de réplicas principal y las credenciales de inicio de sesión del usuario son de un usuario de nivel de administrador (debe tener un permiso de administrador del clúster)