Mongoose 中的 ObjectIds 介绍

发布于 2022-08-18 12:34:28 字数 2860 浏览 216 评论 0

默认情况下,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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

不羁少年

暂无简介

0 文章
0 评论
24 人气
更多

推荐作者

已经忘了多久

文章 0 评论 0

15867725375

文章 0 评论 0

LonelySnow

文章 0 评论 0

走过海棠暮

文章 0 评论 0

轻许诺言

文章 0 评论 0

信馬由缰

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文