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?
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ć.
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; });
źródło
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
źródło
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));
źródło
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"); });
źródło
Ze
save
wszystko 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
źródło
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.
źródło
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
źródło