하위 문서 배열 항목에 대해 Mongoose가 _id 속성을 만들지 않도록 중지


227

하위 문서 배열이 있으면 Mongoose는 각 배열에 대한 ID를 자동으로 만듭니다. 예:

{
    _id: "mainId"
    subDocArray: [
      {
        _id: "unwantedId",
        field: "value"
      },
      {
        _id: "unwantedId",
        field: "value"
      }
    ]
}

Mongoose에게 배열 내 객체의 ID를 만들지 않도록 지시하는 방법이 있습니까?

답변:


288

간단합니다. 하위 스키마에서 이것을 정의 할 수 있습니다.

var mongoose = require("mongoose");

var subSchema = mongoose.Schema({
    //your subschema content
},{ _id : false });

var schema = mongoose.Schema({
    // schema content
    subSchemaCollection : [subSchema]
});

var model = mongoose.model('tablename', schema);

2
_idsubSchema 컬렉션에서도 하위 필드 항목을 포함하는 데 subSchema를 사용하는 경우에만 필드를 건너 뜁 니까? 나는 오늘 SO에 대한 내 자신의 질문 때문에 이것을 특히 묻습니다 .
웹 사용자

1
두 가지 수준의 중첩 하위 스키마 컬렉션을 사용합니다. 즉, 귀하의 예와 비슷한 하위 스키마 컬렉션이 있습니다. 그 안에 다른 하위 스키마 컬렉션을 사용합니다. 첫 번째 수준의 하위 스키마 모델 인스턴스 만 ID를 사용하지 않기를 원하지만 두 번째 수준 (중첩 된) 하위 스키마 모델 인스턴스에는 ID가 필요합니다. 솔루션을 사용할 때, 즉를 지정 { _id: false }하면 두 수준의 하위 스키마에 ID가 없습니다. 이 문제를 해결할 방법이 있습니까?
웹 사용자

1
세 번째 레벨을 설정하려고 시도 했습니까 { _id : true }?
throrin19

: 내가 어제 시도하면이 변경되었다 let studentSchema = new Schema({ studentId: { type: ObjectId, ref: Student.modelName }, performance: [performanceSchema] }, { _id: false });여기에 : let studentSchema = new Schema({ _id: false, id: false, studentId: { type: ObjectId, ref: Student.modelName }, performance: [performanceSchema] });그 중지 _id상의 생성을 studentSchema하지만 유지 _id의 개체에 생성을 performance하위 문서의 배열입니다. 모두 확실하지 경우 _id: false및이 id: false필요합니다.
웹 사용자

고마워, 나에게 가장 좋은 방법.
Swetabja Hazra

128

스키마없이 하위 문서를 작성하고 피할 수 _id있습니다. _id:false하위 문서 선언에 추가 하십시오.

var schema = new mongoose.Schema({
   field1:{
      type:String
   },
   subdocArray:[{
      _id:false,
      field :{type:String}
   }]
});

이렇게하면 _id하위 문서에서 필드를 만들 수 없습니다.

몽구스에서 테스트 v5.9.10


42

또한 하위 스키마를 지정하기 위해 객체 리터럴 구문을 사용하는 경우 _id: false이를 추가 하기 위해 추가 할 수도 있습니다 .

{
   sub: {
      property1: String,
      property2: String,
      _id: false
   }
}

26

mongoose 4.6.3을 사용하고 있으며 스키마에 _id : false를 추가하기 만하면 하위 스키마를 만들 필요가 없습니다.

{
    _id: ObjectId
    subDocArray: [
      {
        _id: false,
        field: "String"
      }
    ]
}

전체 컬렉션에서 고유하게 만드는 방법이 있습니까?
사이타마

아마도이 방법으로는 아니지만 항상 시도 할 수 있습니다. _id제약 조건이 아닌 필드입니다.
jemiloii

하위 문서를 만드는 동안 명시 적으로 _id = mongoose.Types.ObjectId()_id가 컬렉션 전체에서 고유합니까?
사이타마

새로운 스택 오버플로를 열면 많은 사람들이 한 번에 응답 할 수 있습니다.
jemiloii

4

당신은 하나를 사용할 수 있습니다

var subSchema = mongoose.Schema({
//subschema fields    

},{ _id : false });

또는

var subSchema = mongoose.Schema({
//subschema content
_id : false    

});

두 번째 옵션을 사용하기 전에 몽구스 버전을 확인하십시오


1

사전 정의 된 스키마 (_id 포함)를 하위 문서 (_id 제외)로 사용하려면 이론적으로 다음과 같이 할 수 있습니다.

const sourceSchema = mongoose.Schema({
    key : value
})
const subSourceSchema = sourceSchema.clone().set('_id',false);

그러나 그것은 나를 위해 작동하지 않았습니다. 그래서 나는 그것을 추가했다 :

delete subSourceSchema.paths._id;

이제 _id없이 부모 문서에 subSourceSchema를 포함시킬 수 있습니다. 이것이 깨끗한 방법인지는 모르겠지만 작동합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.