mongoose中自建的_id是怎么生成的?

发布于 2022-08-28 01:21:07 字数 848 浏览 10 评论 0

从官方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 inserted
p.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后实现保存?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

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

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

墨离汐 2022-09-04 01:21:07

每个document都必须有一个_id 而且不能重复.
你关掉这个特性 你就得自己制造一个_ID
所以,你当然保存不了.

以往的大感动 2022-09-04 01:21:07

首先,_id是mongodb全局唯一到对象标识符,不会有重复的。
_id的值也可以自己定义,如果没有定义添加的话,系统就会使用默认生成的12个字节构成的对象标识

抹茶夏天i‖ 2022-09-04 01:21:07

专业来说,应该是:
4323原则

  • 4位Unix时间戳

  • 3位机器码

  • 2位进程编号

  • 3位计数器码,从一个随机数开始累计

Mongod会自己根据上面得出来的结果生成ID哒!~

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