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?

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.


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

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

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

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

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


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.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.