Mongoose 中的 ObjectIds 介绍
默认情况下,MongoDB 创建一个 _id
类型的每个文档的属性 ObjectId 。 许多其他数据库默认使用数字 id 属性,但在 MongoDB 和 Mongoose 中,id 默认是对象。
const Model = mongoose.model('Test', mongoose.Schema({ name: String }));
const doc = new Model({ name: 'test' });
doc._id instanceof mongoose.Types.ObjectId; // true
typeof doc._id; // 'object'
doc._id; // '5d6ede6a0ba62570afcedd3a'
铸件
MongoDB ObjectIds 通常使用 24 个十六进制字符串表示,例如 '5d6ede6a0ba62570afcedd3a'
,Mongoose 根据您的 模式 路径为您将 24 个字符字符串转换为 ObjectIds。
const schema = mongoose.Schema({ testId: mongoose.ObjectId });
const Model = mongoose.model('Test', schema);
const doc = new Model({ testId: '5d6ede6a0ba62570afcedd3a' });
// `testId` is an ObjectId, Mongoose casts 24 hex char strings to
// ObjectIds for you automatically based on your schema.
doc.testId instanceof mongoose.Types.ObjectId; // true
Mongoose 可以将其他几个值强制转换为 ObjectId。 值得注意的是 ObjectId 是 12 个任意字节 。 任何 12 字节缓冲区或 12 个字符串都是有效的 ObjectId。
const schema = mongoose.Schema({ testId: mongoose.ObjectId });
const Model = mongoose.model('Test', schema);
// Any 12 character string is a valid ObjectId, because the only defining
// feature of ObjectIds is that they have 12 bytes.
let doc = new Model({ testId: '12char12char' });
doc.testId instanceof mongoose.Types.ObjectId; // true
doc.testId; // '313263686172313263686172'
// Similarly, Mongoose will automatically convert buffers of length 12
// to ObjectIds.
doc = new Model({ testId: Buffer.from('12char12char') });
doc.testId instanceof mongoose.Types.ObjectId; // true
doc.testId; // '313263686172313263686172'
从 ObjectId 获取时间戳
ObjectIds 对创建它们的本地时间进行编码。 这意味着您通常可以从中提取文档的创建时间 _id
。
const schema = mongoose.Schema({ testId: mongoose.ObjectId });
const Model = mongoose.model('Test', schema);
const doc = new Model({ testId: '313263686172313263686172' });
doc.testId.getTimestamp(); // '1996-02-27T01:50:32.000Z'
doc.testId.getTimestamp() instanceof Date; // true
为什么是 ObjectId?
假设您正在构建自己的数据库,并且想要设置一个数字 id
每个新文档的属性。 这 id
属性应该增加,所以你插入的第一个文档得到 id = 0
, 然后 id = 1
等等。
在单个进程中增加计数器是一个简单的问题。 但是如果你有多个进程,比如一个 分片集群 呢? 现在每个进程都需要能够增加计数器,所以每当您插入一个文档时,您还需要增加一个分布式计数器。 如果两个进程之间存在显着的网络延迟,或者如果一个进程关闭,则可能导致性能不可靠。
ObjectIds 旨在解决此问题。 ObjectId 冲突的可能性很小 ,因此 MongoDB 可以分配可能在分布式系统中唯一的 id 没有进程间通信。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论