Mongooseにオブジェクトを保存した後、objectIDを取得するにはどうすればよいですか?


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

保存したオブジェクトのオブジェクトIDをconsole.logに記録したいと思います。マングースでそれを行うにはどうすればよいですか?

回答:


116

これは私のためにうまくいきました:

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
$

私はマングース1.7.2を使用していますが、これは問題なく機能します。念のため、もう一度実行しました。


9
未定義の部屋オブジェクトは、エラー保存nを示します。ドキュメントにアクセスする前にエラーチェックを実行することをお勧めします。
ChrisMcJava 2015年

3
n._idとn.idはどちらも、マングース3.8.21の時点で目的の結果を返します
ChrisMcJava

@ChrisMcJavaあなたのコメントは命の恩人でした!多くの行と多くの関数をコーディングするとき、後でエラー処理を残してしまうことがありました。後で、LOLを忘れたり、忘れたりする可能性があります。ありがとうございます。
ksugiarto 2015

誰かが後日、より簡潔に答えを書きましたが、この答えの余分な部分がもっと役立つかもしれないと思います。そのために、私はこれに賛成票を投じます(8年後、それ以下ではありません)。
CheesusToast19年

43

Mongoは完全なドキュメントをcallbackobjectとして送信するため、そこからのみ取得できます。

例えば

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

10

手動で_idを生成でき、後でそれを引き出すことを心配する必要はありません。

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

知っておくと非常に役立ち、同期が行われるときに非同期コードを防止しました。ありがとう!
ryanm

それがもともとやろうとしていたことでしたが、正直である必要はないと思います。しかし、別の質問に答えます。
CheesusToast19年

9

新しいオブジェクトインスタンスを作成した直後に、データベースに保存しなくても、MongooseでオブジェクトIDを取得できます。

私はこのコードをマングース4で使用しています。他のバージョンでも試すことができます。

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

または

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

2

他の回答はコールバックの追加について言及しています、私は.then()を使用することを好みます

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

ドキュメントから例:。

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

ではsaveあなただけ行うために必要なすべてのです。

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

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

  return room;
});

誰かが以下を使用して同じ結果を得る方法を疑問に思っている場合に備えて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;
  // ...
});

公式ドキュメントをご覧ください


1

まあ、私はこれを持っています:

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

最初の行の「投稿」に注意してください。私のバージョンのMongooseでは、データの保存後に_id値を取得するのに問題はありません。


0

実際には、オブジェクトをインスタンス化するときにIDがすでに存在している必要があります

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

ここでこの答えを確認してください:https//stackoverflow.com/a/7480248/318380

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.