mongodb - mongoose中自建的_id是怎麼產生的?
黄舟
黄舟 2017-04-22 09:00:20
0
3
624

從官方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後實現保存?

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全部回覆(3)
大家讲道理

每個document都必須有一個_id 而且不能重複.
你關掉這個特性 你就得自己製造一個_ID
所以,你當然保存不了.

洪涛

首先,_id是mongodb全域唯一到物件標識符,不會有重複的。
_id的值也可以自己定義,如果沒有定義要加入的話,系統就會使用預設產生的12個位元組構成的物件標識

洪涛

專業來說,應該是:
4323原则

  • 4位元Unix時間戳

  • 3位元機器碼

  • 2位元進程編號

  • 3位元計數器碼,從一個隨機數字開始累積

Mongod會自己根據上面得出來的結果產生ID噠! ~

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板