是否有一种方法来自动生成ObjectIdmongoose模型new'ed?

有没有办法在mongoose中声明一个Model模式,这样当模型被new'ed时_id字段会自动生成?

例如:

var mongoose = require('mongoose'); var Schema = mongoose.Schema; var ObjectIdSchema = Schema.ObjectId; var ObjectId = mongoose.Types.ObjectId; var PersonSchema = new Schema({ _id: ObjectIdSchema, firstName: {type: String, default: 'N/A'}, lastName: {type: String, default: 'N/A'}, age: {type: Number, min: 1} }); var Person = mongoose.model('Person', PersonSchema); 

起初,我认为太棒了,我会做

 _id: {type:ObjectIdSchema, default: new ObjectId()} 

但当然这是行不通的,因为新的ObjectId()只在模式的初始化时被调用。 所以调用新的Persion()两次会创build两个具有相同_id值的对象。

所以有办法做到这一点,每当我做“新人()”一个新的ObjectId()生成?

我试图这样做的原因是因为我需要知道新人的_id值的价值进一步处理。

我也试过:

 var person = new Person({firstName: "Joe", lastName: "Baz"}); person.save(function(err, doc, num){ console.log(doc._id); }); 

即使这样,doc也不包含ObjectId。 但是如果我查看数据库,它确实包含它。

ps我正在使用mongoose2.7.1

PPS我知道我可以手动创buildObjectId时创build人:

 var person = new Person({_id: new ObjectId(), firstName: "Joe", lastName: "Baz"}); 

但我宁愿不必导入ObjectId,每当我想要一个新的人都必须新的。 猜我习惯使用MongoDB的java驱动程序,我可以在模型构造函数中创build_id字段的值。

当你调用var person = new Person(); person._id应该给你的ID(即使它还没有被保存)。 只是实例化它就足以给它一个ID。 你仍然可以保存它,这将存储身份证以及人对象的其余部分

代替:

 _id: {type:ObjectIdSchema, default: new ObjectId()} 

你应该做:

 _id: {type:ObjectIdSchema, default: function () { return new ObjectId()} } 

添加auto标志:

 _id: { type: mongoose.Schema.Types.ObjectId, index: true, required: true, auto: true, } 

资源