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?

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


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

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

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

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

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


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.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.