问题描述
从官方mongoose v3.8.7的手册中看到关于Schema的_id属性,发现这个属性在new一个模型的时候就已经生成了,这个时候根本就没有和MongoDB通信!我好奇mongoose是如何生成这个_id的值的,它能保证唯一性么?
另外,官方提到可以关闭这个特性,但是
var schema = new Schema({ name: String }, { _id: false });var Page = mongoose.model(’Page’, schema);var p = new Page({ name: ’mongodb.org’ });console.log(p); // { name: ’mongodb.org’ }// MongoDB will create the _id when insertedp.save(function (err) { if (err) return handleError(err); Page.findById(p, function (err, doc) { if (err) return handleError(err); console.log(doc); // { name: ’mongodb.org’, _id: ’50341373e894ad16347efe12’ } })})
实际测试发现根本就不会save成功,会提示:
[Error: document must have an _id before saving]
请问如何关闭_id后实现保存?
问题解答
回答1:每个document都必须有一个_id 而且不能重复.你关掉这个特性 你就得自己制造一个_ID所以,你当然保存不了.
回答2:首先,_id是mongodb全局唯一到对象标识符,不会有重复的。_id的值也可以自己定义,如果没有定义添加的话,系统就会使用默认生成的12个字节构成的对象标识
回答3:专业来说,应该是:4323原则
4位Unix时间戳
3位机器码
2位进程编号
3位计数器码,从一个随机数开始累计
Mongod会自己根据上面得出来的结果生成ID哒!~

