Impedisci a Mongoose di creare la proprietà _id per gli elementi dell'array del sottodocumento


227

Se si dispone di matrici di documenti secondari, Mongoose crea automaticamente ID per ognuno. Esempio:

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

C'è un modo per dire a Mongoose di non creare ID per oggetti all'interno di un array?

Risposte:


288

È semplice, puoi definirlo nel sottoschema:

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
questo salterà i _idcampi anche nella raccolta subSchema o solo nel caso in cui subSchema venga utilizzato per incorporare come array di elementi del documento secondario? Lo chiedo in particolare a causa della mia domanda su SO oggi.
Utente Web

1
Uso due livelli di raccolte di schemi secondari nidificati. In altre parole, ho una raccolta SubSchema simile al tuo esempio. All'interno di questo, utilizzo un'altra raccolta di sotto-schemi diversi. Desidero che solo le istanze del modello di sub-schema di primo livello non utilizzino gli ID, ma le istanze del modello di sub-schema di secondo livello (nidificate) devono avere ID. Quando utilizzo la tua soluzione, vale a dire, specificando { _id: false }, entrambi i livelli di sottostruttura sono senza ID. Qualche modo per aggirare questo comportamento?
Utente Web

1
Hai provato a impostare il terzo livello { _id : true }?
throrin19,

quello che ho provato ieri è stato cambiare questo: let studentSchema = new Schema({ studentId: { type: ObjectId, ref: Student.modelName }, performance: [performanceSchema] }, { _id: false });in questo: let studentSchema = new Schema({ _id: false, id: false, studentId: { type: ObjectId, ref: Student.modelName }, performance: [performanceSchema] });e questo ha fermato la _idcreazione sulla creazione studentSchemama ha conservato _idgli oggetti nella performancematrice dei sottodocumenti. Non sono sicuro se entrambi _id: falsee id: falsesono necessari.
Utente Web

Grazie, il modo migliore per me.
Swetabja Hazra,

128

È possibile creare documenti secondari senza schema ed evitare _id. Basta aggiungere _id:falsealla dichiarazione del documento secondario.

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

Ciò impedirà la creazione di un _idcampo nel tuo sottodoc.

Testato in mangusta v5.9.10


42

Inoltre, se si utilizza una sintassi letterale di oggetto per specificare uno schema secondario, è possibile anche aggiungere semplicemente _id: falseper sopprimerlo.

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

26

Sto usando mongoose 4.6.3 e tutto quello che dovevo fare era aggiungere _id: false nello schema, non c'è bisogno di fare un subschema.

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

c'è un modo per renderlo unico nell'intera collezione?
Saitama,

Probabilmente non con questo metodo, ma potresti sempre provare. _idè un campo piuttosto che un vincolo.
jemiloii,

se durante la creazione di _id = mongoose.Types.ObjectId()quel sottodocumento, assegnassi esplicitamente , _ sarebbe stato unico nella raccolta?
Saitama,

basta aprire un nuovo overflow dello stack, in questo modo puoi convincere molte persone a rispondere contemporaneamente ~
jemiloii,

4

Puoi usare uno dei due

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

},{ _id : false });

o

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

});

Controlla la tua versione di mangusta prima di usare la seconda opzione


1

Se si desidera utilizzare uno schema predefinito (con _id) come documento secondario (senza _id), è possibile fare come segue in teoria:

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

Ma non ha funzionato per me. Quindi ho aggiunto che:

delete subSourceSchema.paths._id;

Ora posso includere subSourceSchema nel mio documento principale senza _id. Non sono sicuro che questo sia il modo migliore per farlo, ma funziona.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.