¿Cómo insertar un documento en mongodb usando mongoose y obtener el id generado?


Estoy usando mongoose para operar mongodb. Ahora, para probar, quiero insertar algunos datos en mongodb por conexión nativa.

Pero la pregunta es ¿cómo obtener el id generado después de insertar?

Lo intenté:

var mongoose = require('mongoose');

mongoose.connect('mongo://localhost/shuzu_test');

var conn = mongoose.connection;

var user = {
    a: 'abc'
};

conn.collection('aaa').insert(user);

console.log('User:');
console.log(user);

Pero imprime:

{ a: 'abc' }

No hay un campo _id.

Author: Freewind, 2012-05-09

4 answers

Puede generar _id usted mismo y enviarlo a la base de datos.

var ObjectID = require('mongodb').ObjectID;

var user = {
  a: 'abc',
  _id: new ObjectID()
};

conn.collection('aaa').insert(user);

Esta es una de mis características favoritas de MongoDB. Si necesita crear una serie de objetos, que están vinculados entre sí, no es necesario hacer numerosos viajes de ida y vuelta entre la aplicación y la base de datos. Puede generar todos los ID en la aplicación y luego simplemente insertar todo.

 40
Author: Sergio Tulentsev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-09 16:52:53

Si usa .guardar entonces obtendrá el _id de nuevo en la función de devolución de llamada.

var user = new User({
  a: 'abc'
});

user.save(function (err, results) {
  console.log(results._id);
});
 7
Author: martinedwards,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-14 21:23:28

Puede usar el método Update con la opción upsert: true

aaa.update({
    a : 'abc'
}, {
    a : 'abc'
}, {
    upsert: true
});
 1
Author: Rifaideen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-20 08:00:00

Si te gusta usar Promesas:

const collection = conn.collection('aaa');
const instance = new collection({ a: 'abc' });
instance.save()
    .then(result => {
        console.log(result.id);  // this will be the new created ObjectId
    })
    .catch(...)

O si está utilizando Node.js > = 7.6.0:

const collection = conn.collection('aaa');
const instance = new collection({ a: 'abc' });
try {
    const result = await instance.save();
    console.log(result.id);  // this will be the new created ObjectId
} catch(...)
 1
Author: Kleber,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-20 13:11:48