programing

mongoose 모델이 new'ed일 때 ObjectId를 자동 생성하는 방법이 있습니까?

closeapi 2023. 7. 15. 10:08
반응형

mongoose 모델이 new'ed일 때 ObjectId를 자동 생성하는 방법이 있습니까?

모델이 new'ed일 때 _id 필드가 자동 생성되도록 mongoose에서 모델 스키마를 선언하는 방법이 있습니까?

예:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var ObjectIdSchema = Schema.ObjectId;
var ObjectId = mongoose.Types.ObjectId;

var PersonSchema = new Schema({
    _id:            ObjectIdSchema,
    firstName:      {type: String, default: 'N/A'},
    lastName:       {type: String, default: 'N/A'},
    age:            {type: Number, min: 1}
});

var Person = mongoose.model('Person', PersonSchema);

처음에는 훌륭하다고 생각했어요!, 그냥 할게요.

_id:    {type:ObjectIdSchema, default: new ObjectId()}

하지만 물론 이것은 작동하지 않습니다. 왜냐하면 새로운 ObjectId()는 스키마의 초기화 시에만 호출되기 때문입니다.따라서 newPersion()을 두 번 호출하면 _id 값이 동일한 두 개체가 생성됩니다.

그러면 매번 "새로운 사용자()"를 수행할 때마다 새로운 ObjectId()가 생성되도록 하는 방법이 있습니까?

제가 이렇게 하려고 하는 이유는 추가 처리를 위해 새로운 사람의 _id 값의 값을 알아야 하기 때문입니다.

저도 노력했습니다.

var person = new Person({firstName: "Joe", lastName: "Baz"});
person.save(function(err, doc, num){
    console.log(doc._id);
});

그럼에도 문서에는 ObjectId가 포함되어 있지 않습니다. 하지만 데이터베이스를 찾아보면 포함되어 있습니다.

p.s. 몽구스 2.7.1을 사용하고 있습니다.

p.p.s. 나는 다음과 같은 사람을 만들 때 ObjectId를 수동으로 만들 수 있다는 것을 알고 있습니다.

var person = new Person({_id: new ObjectId(), firstName: "Joe", lastName: "Baz"});

하지만 ObjectId를 가져올 필요가 없고 사람을 새로 만들고 싶을 때마다 새로 만들어야 합니다.모델 생성자에서 _id 필드 값을 생성할 수 있는 mongodb용 Java 드라이버를 사용하는 데 익숙합니다.

추가합니다.auto플래그:

_id: {
    type: mongoose.Schema.Types.ObjectId,
    index: true,
    required: true,
    auto: true,
  }

원천

var person = new person(); person을 부르는 순간._id는 (아직 저장되지 않았더라도) id를 알려줘야 합니다.그것을 인스턴스화하는 것만으로도 그것에 도움을 주기에 충분합니다.이후에도 저장할 수 있습니다. 그러면 ID와 나머지 사용자 개체가 저장됩니다.

다음 대신:

_id:    {type:ObjectIdSchema, default: new ObjectId()}

다음 작업을 수행해야 합니다.

_id:    {type:ObjectIdSchema, default: function () { return new ObjectId()} }

MongoDB 공식 매뉴얼 및 문서에서 발췌:

_id

모든 MongoDB 문서에 필요한 필드입니다._id필드에는 고유한 값이 있어야 합니다.당신은 생각할 수 있습니다._id필드를 문서의 기본 키로 지정합니다.다음을 제외한 새 문서를 작성하는 경우_idMongoDB는 자동으로 필드를 만들고 고유한 BSON ObjectId를 할당합니다.
원천


개체 ID

ObjectId는 작고 고유할 수 있으며 생성 속도가 빠르고 순서가 지정되어 있습니다.ObjectId 값은 12바이트로 구성되며, 여기서 처음 4바이트는 ObjectId 생성을 반영하는 타임스탬프입니다.구체적으로:

Unix epoch 이후의 초를 나타내는 4바이트 값, 5바이트 랜덤 값 및 3바이트 카운터(랜덤 값으로 시작).MongoDB에서 컬렉션에 저장된 각 문서는 고유한 문서를 필요로 합니다._id기본 키 역할을 하는 필드입니다._id필드, MongoDB 드라이버는 자동으로 다음을 위한 ObjectId를 생성합니다._id밭.밭.

이것은 upsert: true로 업데이트 작업을 통해 삽입된 문서에도 적용됩니다.

는 MongoDB를 ._id고유한 ObjectId가 있는 필드입니다.에 대해 ObjectIds 사용_id필드는 다음과 같은 추가적인 이점을 제공합니다. mongo 셸에서 ObjectId의 생성 시간에 액세스할 수 있습니다.ObjectId.getTimestamp()method.ObjectId 값을 저장하는 _id 필드에서 정렬하는 것은 작성 시간에 따라 정렬하는 것과 거의 같습니다.


ObjectId 값은 시간이 지남에 따라 증가해야 하지만 반드시 단조로운 것은 아닙니다.그 이유는 다음과 같습니다.

시간 해상도가 1초만 포함되므로 동일한 초 내에 생성된 ObjectId 값은 시스템 클럭이 다를 수 있는 클라이언트에서 생성된 순서 및 A가 보장되지 않습니다.
출처

으로 명적으선다니언을 합니다._id:

으로 명적으선경우는을 할 때_id "", ""를 지정합니다.auto 옵션:

new Schema({ _id: { type: Schema.ObjectId, auto: true }})

ObjectId만 - turnOn이 true이면 자동으로 생성된 ObjectId 기본값을 추가합니다.
출처


TL;DR

_id 필드 없이 새 문서를 작성하면 MongoDB는 자동으로 필드를 작성하고 고유한 BSON ObjectId를 할당합니다.

이것은 이것을 하는 좋은 방법입니다.

모델:

const schema = new Schema({ userCurrencyId:{type: mongoose.Schema.Types.ObjectId,
        index: true,
        required: true,
        auto: true});

언급URL : https://stackoverflow.com/questions/11604928/is-there-a-way-to-auto-generate-objectid-when-a-mongoose-model-is-newed

반응형