¿Qué es el campo "__v" en Mongoose?

Resuelto Simon Lomax asked hace 12 años • 9 respuestas

Estoy usando Mongoosela versión 3 con MongoDBla versión 2.2. He notado que __vha comenzado a aparecer un campo en mis MongoDBdocumentos. ¿Tiene algo que ver con el control de versiones? ¿Cómo se usa?

Simon Lomax avatar Sep 19 '12 20:09 Simon Lomax
Aceptado

De aquí :

Es versionKeyuna propiedad establecida en cada documento cuando Mongoose lo creó por primera vez. El valor de esta clave contiene la revisión interna del documento. El nombre de esta propiedad de documento es configurable. El valor predeterminado es __v.

Si esto entra en conflicto con su aplicación, puede configurarlo como tal:

new Schema({..}, { versionKey: '_somethingElse' })
Tony The Lion avatar Sep 19 '2012 13:09 Tony The Lion

Bueno, no veo la solución de Tony... así que tengo que encargarme yo mismo...


Si no necesita version_key, puede simplemente:

var UserSchema = new mongoose.Schema({
    nickname: String,
    reg_time: {type: Date, default: Date.now}
}, {
    versionKey: false // You should be aware of the outcome after set to false
});

Establecer versionKey en falso significa que el documento ya no tiene versiones.

Esto es problemático si el documento contiene una serie de subdocumentos. Se podría eliminar uno de los subdocumentos, reduciendo el tamaño de la matriz. Más adelante, otra operación podría acceder al subdocumento en la matriz en su posición original.

Dado que la matriz ahora es más pequeña, puede acceder accidentalmente al subdocumento incorrecto en la matriz.

versionKey resuelve esto asociando el documento con una versionKey, utilizada internamente por mongoose para asegurarse de acceder a la versión correcta de la colección.

Puede encontrar más información en: http://aaronheckmann.blogspot.com/2012/06/mongoose-v3-part-1-versioning.html

kenberkeley avatar Aug 07 '2015 07:08 kenberkeley

Para eliminar en NestJS es necesario agregar la opción al Schema()decorador

@Schema({ versionKey: false })
Lysak avatar Feb 07 '2021 12:02 Lysak

Es posible desactivar la clave de versión si no la necesita.

Vea este ejemplo:

var User = new mongoose.Schema({
   FullName:{
       type :String,
      
   },
   BirthDay:{
       type :String,
       
   },
   Address:{
       type :String,
   },
   Gender:{
       type:String,
   },
   PhoneNumber:{
       type:Number,
       ref:'Account'
   },
   AccountID:{
        type: Schema.Types.ObjectId,
        ref: 'Account'
   },
   UserName:{
       type:String,
       ref:'Account'
   }
},{collection:'User',
   versionKey: false //here
});
Nguyen Phu avatar May 14 '2021 07:05 Nguyen Phu

el campo '__v' en nuestro 'documento' responde a preocupaciones de ' concurrencia optimista' .

Este término básicamente significa en mangosta: vamos, tomaste un documento con 'findOne, findById' pero aún no usaste el método save() de mangosta. ¿Y si en este intervalo, cualquier otro código tomara el mismo documento y usara el método .save() antes de la primera instancia del documento? En este caso de uso, si queremos (específicamente para la mangosta) arrojar un error de versión, usamos optimisticConcurrency: truela opción en el esquema.

y luego mangosta usará '__v1' para comparar estos dos documentos.

sin optimisticConcurrency: trueopción. '__v' no tiene ningún efecto. y mangosta no lo aumentará en 1.

Nota: en las operaciones del tipo 'findOneAndUpdate', no se actualizará '__v'. (solo guardar() actualizaciones)

ratyacatnug avatar Oct 18 '2022 03:10 ratyacatnug