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