¿Cuál es el campo "__v" en Mangosta


304

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?


si no lo desea en el resultado, use _doc en el objeto devuelto forma mangosta
moein rahimi

Respuestas:


295

Desde aquí :

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:

new Schema({..}, { versionKey: '_somethingElse' })

19
¿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:

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


31
¿Cuál es el resultado de establecerlo en falso?
xperator

3
También puede llamar resultFromMongo.toObject({ versionKey: false })para sobreprimir el valor.
Leo Gerber

@xperator el resultado es ningún campo __V en el esquema: {"_id": {"$ oid": "5aa62e99f36d28237f1a41ad"}, "correo electrónico": "scott@gmail.com", "sesiones": 0} vs {"_id ": { "$ oid": "5aa62e99f36d28237f1a41ad"}, "e-mail": "scott@gmail.com", "sesiones": 0 " __v": 0}
Dang

o estoschema.set('versionKey', false);
Stan Wiechers

1
¿Cuál es el resultado después de establecer en falso? aparte de no estar en el documento?
Alguien especial

0

Podemos usar versionKey: false en la definición de esquema

'use strict';

const mongoose = require('mongoose');

export class Account extends mongoose.Schema {

    constructor(manager) {

        var trans = {
            tran_date: Date,
            particulars: String,
            debit: Number,
            credit: Number,
            balance: Number
        }

        super({
            account_number: Number,
            account_name: String,
            ifsc_code: String,
            password: String,
            currency: String,
            balance: Number,
            beneficiaries: Array,
            transaction: [trans]
        }, {
            versionKey: false // set to false then it wont create in mongodb
        });

        this.pre('remove', function(next) {
            manager
                .getModel(BENEFICIARY_MODEL)
                .remove({
                    _id: {
                        $in: this.beneficiaries
                    }
                })
                .exec();
            next();
        });
    }

}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.