¿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?

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.


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;
  });

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

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));

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");
});

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


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.


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.