在Mongoose中保存对象后,如何获取objectID?


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

我要console.log我刚刚保存的对象的对象ID。我该如何在猫鼬中做到这一点?

Answers:


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,它工作正常,请确保再次运行。


8
未定义的房间对象指示错误保存n。在访问文档之前执行错误检查的最佳实践。
ChrisMcJava 2015年

3
从猫鼬3.8.21开始,n._id和n.id都将返回期望的结果
ChrisMcJava 2015年

@ChrisMcJava您的评论可以挽救生命!当我们编写许多行和许多函数的代码时,有时我们会在以后留下错误处理,以后可能永远也不会忘记LOL,谢谢!
ksugiarto

后来有人确实更简洁地写了答案,但我认为此答案中的额外内容可能会更有帮助。为此,我给这个人赞成票(即下线8年,至少)。
Cheesus Toast,

43

Mongo将完整文档作为回调对象发送,因此您仅可以从那里获取它。

例如

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 '18

那是我原本要做的,但我认为没有必要诚实。虽然会回答一个不同的问题。
Cheesus Toast,

8

您可以在建立新模型后在mongoosejs中获得objectid。

我在猫鼬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));

来自docs的示例:

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

注意第一行中的“ post”。使用我的Mongoose版本时,在保存数据后获取_id值没有问题。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.