¿Cómo obtengo el objectID después de guardar un objeto en Mongoose?

81
var n = new Chat();
n.name = "chat room";
n.save(function(){
    //console.log(THE OBJECT ID that I just saved);
});

Quiero console.log la identificación del objeto que acabo de guardar. ¿Cómo hago eso en Mongoose?

TIMEX
fuente

Respuestas:

116

Esto simplemente funcionó para mí:

var mongoose = require('mongoose'),
      Schema = mongoose.Schema;

mongoose.connect('mongodb://localhost/lol', function(err) {
    if (err) { console.log(err) }
});

var ChatSchema = new Schema({
    name: String
});

mongoose.model('Chat', ChatSchema);

var Chat = mongoose.model('Chat');

var n = new Chat();
n.name = "chat room";
n.save(function(err,room) {
   console.log(room.id);
});

$ node test.js
4e3444818cde747f02000001
$

Estoy en Mongoose 1.7.2 y esto funciona bien, solo lo ejecuté de nuevo para estar seguro.

Richard Holanda
fuente
8
un objeto de habitación no definido es indicativo de un error al guardar n. su mejor práctica es realizar una verificación de errores antes de acceder al documento.
ChrisMcJava
3
tanto n._id como n.id devolverán el resultado deseado a partir de la mangosta 3.8.21
ChrisMcJava
@ChrisMcJava ¡tu comentario fue un salvavidas! Cuando codificamos muchas líneas y muchas funciones, a veces dejamos el manejo de errores más tarde, más tarde podría ser nunca o olvidado LOL, ¡Gracias y anw!
ksugiarto
Alguien escribió la respuesta de manera más sucinta en una fecha posterior, pero creo que la parte adicional de esta respuesta puede ser más útil. Por eso le doy a este el voto a favor (8 años después, nada menos).
Cheesus Toast
43

Mongo envía el documento completo como un objeto de devolución de llamada para que pueda obtenerlo solo desde allí.

por ejemplo

n.save(function(err,room){
  var newRoomId = room._id;
  });
Anathema.Imbuido
fuente
10

Puede generar manualmente el _id, entonces no tiene que preocuparse por sacarlo más tarde.

var mongoose = require('mongoose');
var myId = mongoose.Types.ObjectId();

// then set it manually when you create your object

_id: myId

// then use the variable wherever
Glenn
fuente
Muy útil saberlo, evitó el código asincrónico cuando lo haría sincrónico. ¡Gracias!
Ryanm
Eso era lo que iba a hacer originalmente, pero creo que no es necesario para ser honesto. Sin embargo, respondería una pregunta diferente.
Cheesus Toast
8

puede obtener objectid en mongoosejs después de que haya nuevo algún modelo.

Estoy usando este código para trabajar en mongoose 4, puedes probarlo en otra versión

var n = new Chat();
var _id = n._id;

o

n.save((function (_id) {
  return function () {
    console.log(_id);
    // your save callback code in here
  };
})(n._id));
yue
fuente
2

Otras respuestas han mencionado agregar una devolución de llamada, prefiero usar .then ()

n.name = "chat room";
n.save()
.then(chatRoom => console.log(chatRoom._id));

ejemplo de los documentos :.

var gnr = new Band({
  name: "Guns N' Roses",
  members: ['Axl', 'Slash']
});

var promise = gnr.save();
assert.ok(promise instanceof Promise);

promise.then(function (doc) {
  assert.equal(doc.name, "Guns N' Roses");
});
Julián Orinyol
fuente
1

Con savetodo lo que necesitas hacer es:

n.save((err, room) => {
  if (err) return `Error occurred while saving ${err}`;

  const { _id } = room;
  console.log(`New room id: ${_id}`);

  return room;
});

En caso de que alguien se pregunte cómo obtener el mismo resultado usando create:

const array = [{ type: 'jelly bean' }, { type: 'snickers' }];

Candy.create(array, (err, candies) => {
  if (err) // ...

  const [jellybean, snickers] = candies;
  const jellybeadId = jellybean._id;
  const snickersId = snickers._id;
  // ...
});

Consulte el documento oficial

rotimi-mejor
fuente
1

Bueno, tengo esto:

TryThisSchema.post("save", function(next) {
    console.log(this._id);
});

Observe la "publicación" en la primera línea. Con mi versión de Mongoose, no tengo problemas para obtener el valor _id después de guardar los datos.

Roddy P. Carbonell
fuente
0

En realidad, la ID ya debería estar allí al crear una instancia del objeto

var n = new Chat();
console.log(n._id) // => 4e7819d26f29f407b0... -> ID is already allocated

Consulte esta respuesta aquí: https://stackoverflow.com/a/7480248/318380

jazkat
fuente