2012-07-22 76 views
14

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

例如:

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值的对象。

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

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

我也尝试:

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

即使这样,医生不包含的ObjectId。但如果我查看数据库,它确实包含它。

p.s.我正在使用猫鼬2.7.1

p.p.s.我知道这样创造人的时候,我可以手动创建的ObjectId:

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

,但我宁愿没有进口的ObjectId,并有新的它,我想新的一个人每次。猜我习惯于使用MongoDB的java驱动程序,我可以在模型构造函数中为_id字段创建值。

回答

17

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

+2

是的,并且不需要在模式中包含'_id'字段。 – JohnnyHK 2012-07-23 00:58:57

+2

@JohnnyHK,你和Last Rose Studios都是对的。这完全如你所说。我注释掉了“_id:ObjectIdSchema”这一行,当我new'ed Person()它有ID!但是当我没有对它进行评论时,该ID从未生成过。多谢你们!非常感激。 – Khon 2012-07-23 03:30:37

+2

对于新的观众,此行为是否因为改变?今天我不得不提到'default:new mongoose.Types.ObjectId()'没有它,如果我在模型模式中添加了_id,它就不起作用了! – 2015-12-11 22:06:36

6

相反的:

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

你应该这样做:

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

这是不必要的...如果不指定_id,默认为ObjectId并创建自己 – wlingke 2014-06-15 23:08:11

+0

[错误:文档在保存前必须有_id] – 2016-06-29 19:06:36

+0

此答案仍然有用,例如,子文档没有自动生成_id – 2017-02-21 11:31:18

5

添加auto标志:

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

source

相关问题