Evite que Mongoose cree la propiedad _id para los elementos de la matriz de subdocumentos

227

Si tiene matrices de subdocumentos, Mongoose crea automáticamente identificadores para cada uno. Ejemplo:

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

¿Hay alguna manera de decirle a Mongoose que no cree identificadores para objetos dentro de una matriz?

Atlas
fuente

Respuestas:

288

Es simple, puedes definir esto en el 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
fuente
2
¿esto saltará los _idcampos incluso en la colección subSchema, o solo en el caso de que el subSchema se esté utilizando para incrustar como una matriz de elementos de subdocumentos? Pregunto esto particularmente debido a mi propia pregunta sobre SO hoy.
Usuario web
1
Utilizo dos niveles de colecciones de subesquemas anidadas. En otras palabras, tengo una colección subSchema similar a tu ejemplo. Dentro de eso, uso otra colección de subesquemas diferente. Solo quiero que las instancias del modelo de subesquemas de primer nivel no utilicen identificadores, pero las instancias de modelos de subesquemas de segundo nivel (anidadas) deben tener identificadores. Cuando uso su solución, es decir, especificando { _id: false }, ambos niveles de subesquema son sin identificadores. ¿Alguna forma de evitar este comportamiento?
Usuario web
1
¿Has intentado establecer el tercer nivel { _id : true }?
throrin19
lo que probé ayer fue cambiar esto: let studentSchema = new Schema({ studentId: { type: ObjectId, ref: Student.modelName }, performance: [performanceSchema] }, { _id: false });a esto: let studentSchema = new Schema({ _id: false, id: false, studentId: { type: ObjectId, ref: Student.modelName }, performance: [performanceSchema] });y eso detuvo la _idcreación en la creación studentSchemapero retenida _iden los objetos en la performancematriz de subdocumentos. No estoy seguro si ambos _id: falsey id: falseson necesarios.
Usuario web
Gracias, la mejor manera para mí.
Swetabja Hazra
128

Puede crear subdocumentos sin esquema y evitarlos _id. Simplemente agregue _id:falsea su declaración de subdocumento.

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

Esto evitará la creación de un _idcampo en su subdoc.

Probado en mangosta v5.9.10

Joel Grenon
fuente
42

Además, si usa una sintaxis literal de objeto para especificar un _id: falsesubesquema, también puede agregarlo para suprimirlo.

{
   sub: {
      property1: String,
      property2: String,
      _id: false
   }
}
Wlingke
fuente
26

Estoy usando Mongoose 4.6.3 y todo lo que tuve que hacer fue agregar _id: false en el esquema, no es necesario hacer un subesquema.

{
    _id: ObjectId
    subDocArray: [
      {
        _id: false,
        field: "String"
      }
    ]
}
jemiloii
fuente
¿Hay alguna manera de hacer único en toda la colección?
Saitama
Probablemente no con este método, pero siempre puedes intentarlo. _ides un campo en lugar de una restricción.
jemiloii
si durante la creación de _id = mongoose.Types.ObjectId()ese subdocumento, asigno explícitamente , ¿sería _id único en toda la colección?
Saitama
simplemente abra un nuevo desbordamiento de pila, de esta manera puede hacer que muchas personas respondan a la vez ~
jemiloii
4

Puedes usar cualquiera de los dos

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

},{ _id : false });

o

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

});

Verifique su versión de mangosta antes de usar la segunda opción

Deeksha Sharma
fuente
1

Si desea utilizar un esquema predefinido (con _id) como subdocumento (sin _id), puede hacer lo siguiente en teoría:

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

Pero eso no funcionó para mí. Entonces agregué que:

delete subSourceSchema.paths._id;

Ahora puedo incluir subSourceSchema en mi documento principal sin _id. No estoy seguro de que esta sea la forma limpia de hacerlo, pero funciona.

Oliver White
fuente