Mongoose 中的 ObjectIds 介绍

发布于 2022-08-18 12:34:28 字数 2860 浏览 220 评论 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技术交流群

发布评论

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

关于作者

不羁少年

暂无简介

文章
评论
26 人气
更多

推荐作者

微信用户

文章 0 评论 0

小情绪

文章 0 评论 0

ゞ记忆︶ㄣ

文章 0 评论 0

笨死的猪

文章 0 评论 0

彭明超

文章 0 评论 0

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