¿Qué es el campo "__v" en Mongoose?
Estoy usando Mongoose
la versión 3 con MongoDB
la versión 2.2. He notado que __v
ha comenzado a aparecer un campo en mis MongoDB
documentos. ¿Tiene algo que ver con el control de versiones? ¿Cómo se usa?
De aquí :
Es
versionKey
una 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' })
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
Para eliminar en NestJS es necesario agregar la opción al Schema()
decorador
@Schema({ versionKey: false })
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
});
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: true
la opción en el esquema.
y luego mangosta usará '__v1' para comparar estos dos documentos.
sin optimisticConcurrency: true
opció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)