Estoy usando la Mongooseversión 3 con la MongoDBversión 2.2. He notado que un __vcampo ha comenzado a aparecer en mis MongoDBdocumentos. ¿Tiene algo que ver con el control de versiones? ¿Cómo se usa?
El versionKeyes una propiedad establecida en cada documento cuando Mongoose la creó por primera vez. Este valor de clave contiene la revisión interna del documento. El nombre de esta propiedad de documento es configurable. El valor por defecto es __v.
Si esto entra en conflicto con su aplicación, puede configurarlo como tal:
¿Es seguro usar esta propiedad para determinar si se acaba de crear un documento (por ejemplo __v === 0)?
Píldoras de explosión
39
@ExplosionPills para referencia futura: no. La clave de versión solo se incrementa después de operaciones que podrían causar un conflicto, modificando las posiciones de la matriz. Otras actualizaciones no lo incrementarán. La publicación de lanzamiento original lo explica en detalle: aaronheckmann.tumblr.com/post/48943525537/…
Ricardo Tomasi
2
¿Hay alguna forma de ocultarlo de los documentos devueltos de las consultas?
diosney
66
@diosney query.select('-__v'). @ExplosionPills necesitaría agregar middleware de mangosta como schema.pre('save', function (next) { this.increment(); next(); }).
wprl
3
@talentedmrjones @wprl Eso es exactamente lo que estoy haciendo ahora, pero quería algo que pudiera poner directamente en el esquema, así que en todas las consultas.
diosney
73
Bueno, no puedo ver la solución de Tony ... así que tengo que manejarlo yo mismo ...
Si no necesita version_key, puede simplemente:
varUserSchema=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 false significa que el documento ya no está versionado.
Esto es problemático si el documento contiene una matriz de subdocumentos. Uno de los subdocumentos podría eliminarse, reduciendo el tamaño de la matriz. Más tarde, otra operación podría acceder al subdocumento en la matriz en su posición original.
Como 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 la mangosta para asegurarse de que accede a la versión correcta de la colección.
Respuestas:
Desde aquí :
fuente
__v === 0
)?query.select('-__v')
. @ExplosionPills necesitaría agregar middleware de mangosta comoschema.pre('save', function (next) { this.increment(); next(); })
.Bueno, no puedo ver la solución de Tony ... así que tengo que manejarlo yo mismo ...
Si no necesita version_key, puede simplemente:
Establecer versionKey en false significa que el documento ya no está versionado.
Esto es problemático si el documento contiene una matriz de subdocumentos. Uno de los subdocumentos podría eliminarse, reduciendo el tamaño de la matriz. Más tarde, otra operación podría acceder al subdocumento en la matriz en su posición original.
Como 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 la mangosta para asegurarse de que accede a la versión correcta de la colección.
Se puede encontrar más información en: http://aaronheckmann.blogspot.com/2012/06/mongoose-v3-part-1-versioning.html
fuente
resultFromMongo.toObject({ versionKey: false })
para sobreprimir el valor.schema.set('versionKey', false);
Podemos usar versionKey: false en la definición de esquema
fuente