Node.js mongodb driver async / await consultas

Tengo una aplicación node.js que usa el controlador nativo mongodb. En el proceso de migrar el código de mi aplicación a async / await usando el nodo v8.9.1, estoy luchando para encontrar una forma elegante para las consultas mongodb. El principal problema con el controlador mongodb es que todas las consultas utilizan devoluciones de llamada donde las funciones de promesas son obligatorias para los métodos asíncronos.

Alternativas: mongoose : promete consultas en desuso y obliga a usar el modelo de esquema, que es un poco de sobrecarga para mi aplicación. mongoist – supuestamente genial, ya que se construyó con async / espera en mente y completamente prometedor, pero errores con la conexión SSL a mongodb y documentación deficiente – me alejaron de esta solución.

La única solución que logré implementar de una manera elegante es usar el paquete npm de callback para convertir el controlador mongodb a la promesa de API.

¿Alguna idea fresca para una forma elegante de alto rendimiento?

Edición: ‘mongodb’ v3.x

de acuerdo con mongoDB ES6, verifique este fragmento de código;

let MongoClient = require('mongodb').MongoClient; const connectionString = 'mongodb://localhost:27017'; (async () => { let client = await MongoClient.connect(connectionString, { useNewUrlParser: true }); let db = client.db('dbName'); try { const res = await db.collection("collectionName").updateOne({ "someKey": someValue }, { $set: someObj }, { upsert: true }); console.log(`res => ${JSON.stringify(res)}`); } finally { client.close(); } })() .catch(err => console.error(err)); 

Gracias. Trabajando muy bien con ES6:

 const middleWare = require('middleWare'); const MONGO = require('mongodb').MongoClient; router.get('/', middleWare(async (req, res, next) => { const db = await MONGO.connect(url); const MyCollection = db.collection('MyCollection'); const result = await MyCollection.find(query).toArray(); res.send(result); })) 

Si no pasa una callback, el cliente mongodb devuelve una promesa.

El controlador oficial de MongoDB Node.js proporciona tanto una callback como una interacción basada en Promised con MongoDB, lo que permite a las aplicaciones aprovechar al máximo las nuevas funciones de ES6

De los documentos oficiales.

Estoy publicando esto como una respuesta porque no puedo comentar sobre la respuesta de Ido Lev . Moveré esto tan pronto como haya alcanzado la reputación de 50.

No te olvides de cerrar la conexión db. De lo contrario, es posible que su aplicación no pueda conectarse a la base de datos debido a demasiadas conexiones abiertas (me sucedió hace una semana).

Su consulta puede tener éxito o fallar, por lo que tiene sentido cerrar la conexión en un bloque finally .

 const db = await MongoClient.connect(url); try { const stuff = await db.collection("Stuff").find({}); // Do something with the result of the query } finally { db.close(); } 

Actualización : Parece que esto tampoco solucionó mi problema. Algunas personas dicen que ni siquiera es necesario cerrar la conexión manualmente. Parece que es mejor reutilizar su conexión a través de su aplicación si es posible.

Consulta de búsqueda de mongoose usando async / await

No use mongoose.connect en caso de async / await

  var router = require("express").Router() var mongoose = require("mongoose") var await = require("await") var async = require("async") var mongoUrl = "mongodb://localhost:27017/ekaushalnsdc" router.get("/async/await/find",async(req, res, next) => { try { var db = await mongoose.createConnection(mongoUrl) var colName = db.collection('collectionName') var result = await colName.find({}).toArray() res.json(result) }catch(ex) { res.json(ex.message) } }) 

… pero si desea trabajar con el cursor sin descargar a Array, no puede usar await con las funciones find () o aggregate (), entonces tiene que usar el código:

 const cursor = db.collection('name').aggregate( [ { "$match": {code: 10} }, { "$count": "count" } ], { "allowDiskUse": false } ) for (let doc = await cursor.next(); doc != null; doc = await cursor.next()) { console.log('aggregate:', doc.count); }