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?

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);

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


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
   }
}

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"
      }
    ]
}

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


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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.