Jak uzyskać identyfikator objectID po zapisaniu obiektu w Mongoose?

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

Chcę, aby console.log była identyfikatorem obiektu, który właśnie zapisałem. Jak mam to zrobić w Mongoose?

TIMEX
źródło

Odpowiedzi:

115

To właśnie zadziałało dla mnie:

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
$

Jestem na Mongoose 1.7.2 i to działa dobrze, po prostu uruchomiłem go ponownie, aby się upewnić.

Richard Holland
źródło
9
niezdefiniowany obiekt pomieszczenia wskazuje na błąd zapisu n. Najlepszą praktyką jest sprawdzenie błędów przed uzyskaniem dostępu do dokumentu.
ChrisMcJava
3
zarówno n._id, jak i n.id zwrócą żądany wynik jako mangusta 3.8.21
ChrisMcJava
@ChrisMcJava Twój komentarz uratował życie! Kiedy kodujemy wiele wierszy i wiele funkcji, czasami zostawiliśmy obsługę błędów później, później mogliśmy nigdy nie zostać zapomniani LOL, dzięki anw!
ksugiarto
Ktoś napisał odpowiedź bardziej zwięźle w późniejszym terminie, ale myślę, że dodatkowy fragment tej odpowiedzi może być bardziej pomocny. Za to daję temu głosowaniu za (8 lat w dół, nie mniej).
Toast z serem
42

Mongo wysyła cały dokument jako obiekt wywołania zwrotnego, więc możesz go po prostu pobrać tylko stamtąd.

na przykład

n.save(function(err,room){
  var newRoomId = room._id;
  });
Anathema.Imbued
źródło
10

Możesz ręcznie wygenerować _id i nie musisz się martwić o późniejsze wyciąganie go.

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
źródło
Bardzo pomocna jest wiedza, zapobiega tworzeniu kodu asynchronicznego, gdy robi to synchronicznie. Dzięki!
ryanm
To było to, co pierwotnie zamierzałem zrobić, ale myślę, że nie jest to konieczne, aby być szczerym. Odpowiedziałbym jednak na inne pytanie.
Toast z serem
9

Możesz uzyskać identyfikator obiektu w Mongoose zaraz po utworzeniu nowej instancji obiektu bez konieczności zapisywania go w bazie danych.

Używam tego kodu do pracy w Mongoose 4. Możesz spróbować w innych wersjach.

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

lub

n.save((function (_id) {
  return function () {
    console.log(_id);
    // your save callback code in here
  };
})(n._id));
yue
źródło
2

Inne odpowiedzi wspominały o dodaniu wywołania zwrotnego, wolę używać. Then ()

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

Przykład z tych Dokumenty .

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");
});
Julian Orinyol
źródło
1

Ze savewszystko po prostu trzeba zrobić, to:

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

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

  return room;
});

Na wszelki wypadek, gdyby ktoś się zastanawiał, jak uzyskać ten sam wynik za pomocą 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;
  // ...
});

Sprawdź oficjalny dokument

rotimi-best
źródło
1

Cóż, mam to:

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

Zwróć uwagę na „post” w pierwszej linii. W mojej wersji Mongoose nie mam problemu z uzyskaniem wartości _id po zapisaniu danych.

Roddy P. Carbonell
źródło
0

W rzeczywistości identyfikator powinien już istnieć podczas tworzenia wystąpienia obiektu

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

Sprawdź tę odpowiedź tutaj: https://stackoverflow.com/a/7480248/318380

jazkat
źródło