Як отримати ідентифікатор об’єкта після збереження об’єкта в Mongoose?


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

Я хочу console.log ідентифікатор об'єкта щойно збереженого об'єкта. Як це зробити в Mongoose?

Відповіді:


116

Це просто спрацювало для мене:

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
$

Я на mongoose 1.7.2, і це працює чудово, просто запустив його ще раз, щоб бути впевненим.


9
невизначений об'єкт кімнати свідчить про помилку при збереженні n. його найкраща практика - перевірити помилку перед доступом до документа.
ChrisMcJava

3
як n._id, так і n.id повернуть бажаний результат, починаючи з мангуста 3.8.21
ChrisMcJava

@ChrisMcJava ваш коментар врятував життя! Коли ми кодуємо багато рядків і багато функцій, іноді ми залишаємо обробку помилок пізніше, пізніше може бути ніколи або забутий LOL, спасибі ану!
ksugiarto

Хтось писав відповідь більш коротко пізніше, але я думаю, що додатковий фрагмент у цій відповіді може бути більш корисним. За це я даю цьому голос (8 років, не менше).
Cheesus Toast

43

Mongo надсилає повний документ як callbackobject, щоб ви могли просто отримати його лише звідти.

наприклад

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

10

Ви можете вручну створити _id, тоді вам не доведеться турбуватися про те, щоб витягти його пізніше.

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

Дуже корисно знати, запобігли асинхронний код, коли синхронний буде робити. Дякую!
ryanm

Це було те, що я спочатку збирався робити, але я вважаю, що не потрібно бути чесним. Хоча відповів би на інше запитання.
тост за

9

Ви можете отримати ідентифікатор об’єкта в Mongoose відразу після створення нового екземпляра об’єкта без необхідності зберігати його в базі даних.

Я використовую цей код роботи в mongoose 4. Ви можете спробувати його в інших версіях.

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

або

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

2

В інших відповідях згадується додавання зворотного дзвінка, я віддаю перевагу використанню .then ()

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

приклад з документів :.

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

З saveвсе , що вам просто потрібно зробити , це:

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

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

  return room;
});

Про всяк випадок, якщо хтось задається питанням, як отримати той самий результат, використовуючи 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;
  // ...
});

Перегляньте офіційний документ


1

Ну, у мене є таке:

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

Зверніть увагу на "допис" у першому рядку. У моїй версії Mongoose у мене немає проблем з отриманням значення _id після збереження даних.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.