Hentikan Mongoose dari membuat properti _id untuk item array sub-dokumen

227

Jika Anda memiliki larik sub dokumen, Mongoose secara otomatis membuat id untuk masing-masingnya. Contoh:

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

Apakah ada cara untuk memberitahu Mongoose untuk tidak membuat id untuk objek dalam array?

Atlas
sumber

Jawaban:

288

Sederhana, Anda dapat mendefinisikan ini di dalam 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);
throrin19
sumber
2
apakah ini akan melewatkan _idbidang bahkan dalam koleksi subSchema, atau hanya dalam kasus di mana subSchema sedang digunakan untuk menanamkan sebagai array item sub-dokumen? Saya menanyakan ini terutama karena pertanyaan saya sendiri pada SO hari ini.
Pengguna Web
1
Saya menggunakan dua tingkat koleksi sub-skema bersarang. Dengan kata lain, saya memiliki koleksi subSchema yang mirip dengan contoh Anda. Di dalamnya, saya menggunakan koleksi sub-skema lain yang berbeda. Saya hanya ingin contoh model sub-skema tingkat pertama tidak menggunakan id, tetapi model model sub-skema tingkat kedua (bersarang) harus memiliki id. Ketika saya menggunakan solusi Anda, yaitu, menentukan { _id: false }, kedua tingkat sub-skema tanpa id. Adakah cara untuk mengatasi perilaku ini?
Pengguna Web
1
Sudahkah Anda mencoba, untuk mengatur level ketiga { _id : true }?
throrin19
apa yang saya coba kemarin adalah mengubah ini: let studentSchema = new Schema({ studentId: { type: ObjectId, ref: Student.modelName }, performance: [performanceSchema] }, { _id: false });ini: let studentSchema = new Schema({ _id: false, id: false, studentId: { type: ObjectId, ref: Student.modelName }, performance: [performanceSchema] });dan itu menghentikan _idpenciptaan pada studentSchematetapi mempertahankan _idpenciptaan pada objek dalam performancearray sub-dokumen. Tidak yakin apakah keduanya _id: falsedan id: falsediperlukan.
Pengguna Web
Terima kasih, cara terbaik untukku.
Swetabja Hazra
128

Anda dapat membuat sub-dokumen tanpa skema dan hindari _id. Tambahkan saja _id:falsedeklarasi subdokumentasi Anda.

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

Ini akan mencegah pembuatan _idbidang di subdoc Anda.

Diuji dalam luwak v5.9.10

Joel Grenon
sumber
42

Selain itu, jika Anda menggunakan sintaks literal objek untuk menentukan sub-skema, Anda juga dapat menambahkan _id: falseuntuk menekannya.

{
   sub: {
      property1: String,
      property2: String,
      _id: false
   }
}
wlingke
sumber
26

Saya menggunakan luwak 4.6.3 dan yang harus saya lakukan adalah menambahkan _id: false dalam skema, tidak perlu membuat subschema.

{
    _id: ObjectId
    subDocArray: [
      {
        _id: false,
        field: "String"
      }
    ]
}
Jemiloii
sumber
apakah ada cara untuk membuat unik di seluruh koleksi?
Saitama
Mungkin tidak dengan metode ini, tetapi Anda selalu bisa mencoba. _idadalah bidang daripada kendala.
jemiloii
jika selama pembuatan sub-dokumen itu, saya menetapkan secara eksplisit _id = mongoose.Types.ObjectId(), apakah _id itu unik di seluruh koleksi?
Saitama
cukup buka stack overflow baru, dengan cara ini Anda bisa membuat banyak orang menjawab sekaligus ~
jemiloii
4

Anda bisa menggunakan salah satunya

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

},{ _id : false });

atau

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

});

Periksa versi luwak Anda sebelum menggunakan opsi kedua

Deeksha Sharma
sumber
1

Jika Anda ingin menggunakan skema yang telah ditentukan (dengan _id) sebagai sub dokumen (tanpa _id), Anda dapat melakukan sebagai berikut dalam teori:

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

Tetapi itu tidak berhasil untuk saya. Jadi saya menambahkan:

delete subSourceSchema.paths._id;

Sekarang saya dapat memasukkan subSourceSchema dalam dokumen induk saya tanpa _id. Saya tidak yakin ini cara bersih untuk melakukannya, tetapi berhasil.

Oliver White
sumber