찾다

 >  Q&A  >  본문

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

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

黄舟黄舟2764일 전601

모든 응답(3)나는 대답할 것이다

  • 大家讲道理

    大家讲道理2017-04-22 09:02:20

    각 문서에는 _id가 있어야 하며 반복할 수 없습니다.
    이 기능을 끄면 _ID를 직접 만들어야 합니다
    그러니 당연히 저장할 수 없습니다.

    회신하다
    0
  • PHP中文网

    PHP中文网2017-04-22 09:02:20

    먼저 _id는 mongodb의 전역적으로 고유한 개체 식별자이므로 중복이 없습니다.
    _id 값은 직접 정의할 수도 있습니다. 정의가 추가되지 않으면 시스템은 기본적으로 생성된 12바이트 개체 식별자를 사용합니다.

    회신하다
    0
  • PHP中文网

    PHP中文网2017-04-22 09:02:20

    전문적인 표현은 다음과 같습니다.
    4323原则

    • 4자리 Unix 타임스탬프

    • 3자리 기계코드

    • 2자리 프로세스 번호

    • 임의의 숫자로 시작하는 3자리 카운터 코드

    Mongod는 위에서 얻은 결과를 바탕으로 ID를 생성합니다! ~

    회신하다
    0
  • 취소회신하다