首页 文章

当mongoose模型是新的时,有没有办法自动生成ObjectId?

提问于
浏览
17

有没有办法在mongoose中声明一个Model模式,这样当模型新建时,_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()两次会创建两个具有相同_id值的对象 .

那么有没有办法做到这一点,每次我做“新的Person()”生成一个新的ObjectId()?

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

我也尝试过:

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

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

附:我正在使用猫鼬2.7.1

p.p.s.我知道我可以在创建人员时手动创建ObjectId:

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

但我宁愿不必导入ObjectId,每次我想要新建一个Person时都必须新建它 . 我以前习惯使用mongodb的java驱动程序,我可以在模型构造函数中为_id字段创建值 .

3 回答

  • 20

    你调用var person = new Person(); person._id应该给你id(即使它尚未保存) . 只是实例化它就足以给它一个id . 你仍然可以在之后保存它,这将存储id以及person对象的其余部分

  • 9

    添加 auto 标志:

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

    source

  • 12

    代替:

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

    你应该做:

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

相关问题