หยุด Mongoose จากการสร้างคุณสมบัติ _id สำหรับรายการอาร์เรย์เอกสารย่อย


227

หากคุณมีอาร์เรย์ย่อยเอกสาร Mongoose จะสร้างรหัสสำหรับแต่ละรายการโดยอัตโนมัติ ตัวอย่าง:

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

มีวิธีบอก Mongoose ว่าไม่สร้างรหัสสำหรับวัตถุภายในอาร์เรย์หรือไม่?

คำตอบ:


289

ง่ายมากคุณสามารถกำหนดสิ่งนี้ใน subschema:

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
จะข้าม_idเขตข้อมูลนี้แม้ในคอลเลกชัน subSchema หรือเฉพาะในกรณีที่มีการใช้ subSchema เพื่อฝังเป็นอาร์เรย์ของรายการเอกสารย่อย ฉันถามสิ่งนี้โดยเฉพาะเนื่องจากคำถามของฉันเองในวันนี้
ผู้ใช้เว็บ

1
ฉันใช้คอลเลกชันย่อยสคีมาย่อยสองระดับ กล่าวอีกนัยหนึ่งฉันมีคอลเลกชัน subSchema คล้ายกับตัวอย่างของคุณ ภายในนั้นฉันใช้คอลเลกชันย่อยสคีมาอื่น ฉันต้องการเฉพาะอินสแตนซ์ของโมเดลย่อยสคีมาระดับแรกเท่านั้นที่จะไม่ใช้ ID แต่อินสแตนซ์ของแบบจำลองสคีมาย่อยระดับที่สอง (ซ้อนกัน) จำเป็นต้องมี ID เมื่อฉันใช้โซลูชันของคุณนั่นคือการระบุ{ _id: false }ทั้งสองระดับของ sub-schema ไม่มี id มีวิธีใดบ้างที่จะหลีกเลี่ยงพฤติกรรมนี้
ผู้ใช้เว็บ

1
คุณได้ลองสำหรับระดับที่สามในการตั้งค่า{ _id : true }?
throrin19 19

สิ่งที่ฉันลองเมื่อวานนี้คือการเปลี่ยนแปลงสิ่งนี้: 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

นอกจากนี้หากคุณใช้ไวยากรณ์ตัวอักษรของวัตถุเพื่อระบุ sub-schema คุณอาจเพียงแค่เพิ่ม_id: falseเข้าไปแทนที่

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

26

ฉันใช้พังพอน 4.6.3 และทั้งหมดที่ฉันต้องทำคือเพิ่ม _id: false ใน schema โดยไม่ต้องสร้าง subschema

{
    _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;

ตอนนี้ฉันสามารถรวม subSourceSchema ในเอกสารหลักของฉันโดยไม่มี _id ฉันไม่แน่ใจว่านี่เป็นวิธีที่สะอาดที่จะทำ แต่มันได้ผล

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.