O que é o campo "__v" no Mongoose

304

Estou usando a Mongooseversão 3 com a MongoDBversão 2.2. Percebi que um __vcampo começou a aparecer nos meus MongoDBdocumentos. Tem algo a ver com versionamento? Como isso é usado?

Simon Lomax
fonte
se você não quer que ele na _doc uso resultado no formulário objeto retornado mongoose
Moein Rahimi

Respostas:

295

A partir daqui :

A versionKeyé uma propriedade definida em cada documento quando o primeiro criado por Mongoose. Este valor de chaves contém a revisão interna do documento. O nome desta propriedade do documento é configurável. O padrão é __v.

Se isso entrar em conflito com seu aplicativo, você poderá configurar da seguinte maneira:

new Schema({..}, { versionKey: '_somethingElse' })
Tony o leão
fonte
19
É seguro usar essa propriedade para determinar se um documento foi criado (por exemplo __v === 0)?
Pílulas de explosão
39
@ExplosionPills para referência futura: não. A chave de versão é incrementada apenas após operações que podem causar um conflito, modificando as posições da matriz. Outras atualizações não o incrementarão. O post de lançamento original explica isso em detalhes: aaronheckmann.tumblr.com/post/48943525537/...
Ricardo Tomasi
2
Existe uma maneira de ocultá-lo dos documentos retornados das consultas?
Diosney
6
@diosney query.select('-__v'). @ExplosionPills você precisaria adicionar o middleware mangusto schema.pre('save', function (next) { this.increment(); next(); }).
wprl
3
@talentedmrjones @wprl É exatamente o que estou fazendo agora, mas queria algo que pudesse colocar diretamente no esquema em todas as consultas.
diosney
73

Bem, eu não consigo ver a solução do Tony ... então eu mesmo tenho que lidar com isso ...


Se você não precisa do version_key, pode:

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
});

Definir versionKey como false significa que o documento não está mais com versão.

Isso é problemático se o documento contiver uma matriz de subdocumentos. Um dos subdocumentos pode ser excluído, reduzindo o tamanho da matriz. Posteriormente, outra operação poderia acessar o subdocumento na matriz em sua posição original.

Como a matriz agora é menor, ela pode acessar acidentalmente o subdocumento errado na matriz.

O versionKey resolve isso associando o documento ao a versionKey, usado pelo mangusto internamente para garantir que ele acesse a versão de coleção correta.

Mais informações podem ser encontradas em: http://aaronheckmann.blogspot.com/2012/06/mongoose-v3-part-1-versioning.html

Kenberkeley
fonte
31
qual é o resultado de defini-lo como falso?
Xperator
3
Você também pode ligar resultFromMongo.toObject({ versionKey: false }), para suprimir o valor.
Leo Gerber
@xperator, o resultado não é um campo __V no esquema: {"_id": {"$ oid": "5aa62e99f36d28237f1a41ad"}, "email": "[email protected]", "sessions": 0} vs {"_id ": { "$ oid": "5aa62e99f36d28237f1a41ad"}, "email": "[email protected]", "sessões": 0 " __v": 0}
Dang
ou issoschema.set('versionKey', false);
Stan Wiechers 06/04
1
o que vem depois de definir falso? diferente de não estar no documento?
Alguém Especial
0

Podemos usar versionKey: false na definição do 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();
        });
    }

}
KARTHIKEYAN.A
fonte