Empêcher Mongoose de créer la propriété _id pour les éléments du tableau de sous-documents

227

Si vous avez des tableaux de sous-documents, Mongoose crée automatiquement des identifiants pour chacun d'eux. Exemple:

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

Existe-t-il un moyen de dire à Mongoose de ne pas créer d'ID pour les objets d'un tableau?

Atlas
la source

Réponses:

288

C'est simple, vous pouvez définir cela dans le sous-schéma:

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
la source
2
cela sautera-t-il les _idchamps même dans la collection subSchema, ou seulement dans le cas où le sousSchema est utilisé pour être incorporé en tant que tableau d'éléments de sous-document? Je pose cette question en particulier à cause de ma propre question sur SO aujourd'hui.
Utilisateur Web
1
J'utilise deux niveaux de collections de sous-schémas imbriqués. En d'autres termes, j'ai une collection subSchema similaire à votre exemple. Dans ce cadre, j'utilise une autre collection de sous-schémas différente. Je souhaite que seules les instances de modèle de sous-schéma de premier niveau n'utilisent pas d'identifiants, mais les instances de modèle de sous-schéma de deuxième niveau (imbriquées) doivent avoir des identifiants. Lorsque j'utilise votre solution, c'est-à-dire en spécifiant { _id: false }, les deux niveaux de sous-schéma sont sans identifiants. Une façon de contourner ce problème?
Utilisateur Web
1
Avez-vous essayé de définir le troisième niveau { _id : true }?
throrin19
ce que j'ai essayé hier était de changer ceci: let studentSchema = new Schema({ studentId: { type: ObjectId, ref: Student.modelName }, performance: [performanceSchema] }, { _id: false });en ceci: let studentSchema = new Schema({ _id: false, id: false, studentId: { type: ObjectId, ref: Student.modelName }, performance: [performanceSchema] });et cela a arrêté la _idcréation sur le studentSchemamais a conservé la _idcréation sur les objets dans le performancetableau des sous-documents. Je ne sais pas si les deux _id: falseet id: falsesont nécessaires.
Utilisateur Web
Merci, le meilleur moyen pour moi.
Swetabja Hazra
128

Vous pouvez créer des sous-documents sans schéma et éviter _id. Ajoutez simplement _id:falseà votre déclaration de sous-document.

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

Cela empêchera la création d'un _idchamp dans votre sous-doc.

Testé chez Mongoose v5.9.10

Joel Grenon
la source
42

De plus, si vous utilisez une syntaxe littérale d'objet pour spécifier un sous-schéma, vous pouvez également simplement l'ajouter _id: falsepour le supprimer.

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

J'utilise mangouste 4.6.3 et tout ce que j'avais à faire était d'ajouter _id: false dans le schéma, pas besoin de faire un sous-schéma.

{
    _id: ObjectId
    subDocArray: [
      {
        _id: false,
        field: "String"
      }
    ]
}
jemiloii
la source
existe-t-il un moyen de rendre unique l'ensemble de la collection?
Saitama
Probablement pas avec cette méthode, mais vous pouvez toujours essayer. _idest un champ plutôt qu'une contrainte.
jemiloii
si lors de la création de ce sous-document, j'attribue explicitement _id = mongoose.Types.ObjectId(), est-ce que _id serait unique à travers la collection alors?
Saitama
il suffit d'ouvrir un nouveau débordement de pile, de cette façon, vous pouvez demander à beaucoup de gens de répondre en même temps ~
jemiloii
4

Vous pouvez utiliser l'un des deux

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

},{ _id : false });

ou

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

});

Vérifiez votre version de mangouste avant d'utiliser la deuxième option

Deeksha Sharma
la source
1

Si vous souhaitez utiliser un schéma prédéfini (avec _id) comme sous-document (sans _id), vous pouvez faire comme suit en théorie:

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

Mais cela n'a pas fonctionné pour moi. J'ai donc ajouté que:

delete subSourceSchema.paths._id;

Maintenant, je peux inclure subSourceSchema dans mon document parent sans _id. Je ne suis pas sûr que ce soit la bonne façon de procéder, mais cela fonctionne.

Oliver White
la source