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.