Wie erhalte ich die Objekt-ID, nachdem ich ein Objekt in Mongoose gespeichert habe?

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

Ich möchte die Objekt-ID des Objekts, das ich gerade gespeichert habe, in console.log speichern. Wie mache ich das in Mongoose?

TIMEX
quelle

Antworten:

116

Das hat gerade bei mir funktioniert:

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
$

Ich bin auf Mungo 1.7.2 und das funktioniert einwandfrei. Ich habe es nur noch einmal ausgeführt, um sicherzugehen.

Richard Holland
quelle
8
Ein undefiniertes Raumobjekt zeigt eine Fehlerersparnis an. Es wird empfohlen, vor dem Zugriff auf das Dokument eine Fehlerprüfung durchzuführen.
ChrisMcJava
3
Sowohl n._id als auch n.id geben das gewünschte Ergebnis ab Mungo 3.8.21
ChrisMcJava
@ ChrisMcJava Ihr Kommentar war ein Lebensretter! Wenn wir viele Zeilen und viele Funktionen codieren, haben wir manchmal die Fehlerbehandlung später verlassen, später konnte nie oder nie vergessen werden LOL, Danke anw!
ksugiarto
Jemand hat die Antwort zu einem späteren Zeitpunkt prägnanter geschrieben, aber ich denke, das zusätzliche Bit in dieser Antwort kann hilfreicher sein. Dafür gebe ich diesem die Stimme (8 Jahre später, nicht weniger).
Cheesus Toast
43

Mongo sendet das gesamte Dokument als Rückrufobjekt, sodass Sie es einfach nur von dort abrufen können.

zum Beispiel

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

Sie können die _id manuell generieren, ohne sich später darum kümmern zu müssen, sie wieder herauszuziehen.

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
quelle
Sehr hilfreich zu wissen, verhindert asynchronen Code, wenn synchron wäre. Vielen Dank!
Ryanm
Das war es, was ich ursprünglich tun wollte, aber ich denke, es ist unnötig, ehrlich zu sein. Würde aber eine andere Frage beantworten.
Cheesus Toast
8

Sie können in Mongoosejs Objektid bekommen, nachdem Sie ein neues Modell haben.

Ich benutze diesen Code Arbeit in Mungo 4, Sie können es in einer anderen Version versuchen

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

oder

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

Andere Antworten haben das Hinzufügen eines Rückrufs erwähnt. Ich bevorzuge die Verwendung von .then ()

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

Beispiel aus den Dokumenten :.

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
quelle
1

Mit saveallem , was Sie brauchen nur zu tun:

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

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

  return room;
});

Nur für den Fall, dass sich jemand fragt, wie man das gleiche Ergebnis erzielt, indem man 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;
  // ...
});

Schauen Sie sich das offizielle Dokument an

Rotimi-am besten
quelle
1

Nun, ich habe folgendes:

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

Beachten Sie den "Beitrag" in der ersten Zeile. Mit meiner Version von Mongoose habe ich keine Probleme, den Wert _id zu erhalten, nachdem die Daten gespeichert wurden.

Roddy P. Carbonell
quelle
0

Eigentlich sollte die ID bereits vorhanden sein, wenn das Objekt instanziiert wird

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

Überprüfen Sie diese Antwort hier: https://stackoverflow.com/a/7480248/318380

jazkat
quelle