mongodb - mongoose中自建的_id是怎么生成的?
黄舟
黄舟 2017-04-22 09:00:20
0
3
626

从官方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)
大家讲道理

各ドキュメントには _id が必要であり、それを繰り返すことはできません。
この機能をオフにした場合は、_ID を自分で作成する必要があります
したがって、もちろん保存することはできません。

いいねを押す +0
洪涛

まず第一に、_id は mongodb 内でグローバルに一意なオブジェクト識別子であり、重複することはありません。
_id の値は自分で定義することもできます。定義が追加されない場合、システムはデフォルトで生成された 12 バイトのオブジェクト識別子を使用します。

いいねを押す +0
洪涛

専門的に言えば、次のようになります:
4323原则

  • 4 桁の Unix タイムスタンプ

  • 3桁のマシンコード

  • 2桁のプロセス番号

  • 乱数から始まる3桁のカウンターコード

Mongod は上記で得られた結果に基づいて ID を生成します! ~

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート