Qual è il campo "__v" in Mongoose


304

Sto usando la Mongooseversione 3 con la MongoDBversione 2.2. Ho notato che un __vcampo ha iniziato a comparire nei miei MongoDBdocumenti. Ha a che fare con il controllo delle versioni? Come si usa


se non lo vuoi nel risultato, usa _doc sull'oggetto restituito da mongoose
moein rahimi

Risposte:


295

Da qui :

Il versionKeyè una struttura impostata su ogni documento quando prima creato da Mongoose. Questo valore di chiavi contiene la revisione interna del documento. Il nome di questa proprietà del documento è configurabile. L'impostazione predefinita è __v.

Se questo è in conflitto con l'applicazione, è possibile configurare come tale:

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

19
È sicuro usare questa proprietà per determinare se un documento è stato appena creato (ad es. __v === 0)?
Pillole di esplosione il

39
@ExplosionPills per riferimento futuro: no. La chiave di versione viene incrementata solo dopo operazioni che potrebbero causare un conflitto, modificando le posizioni dell'array. Altri aggiornamenti non lo incrementeranno. Il post sulla versione originale lo spiega in dettaglio: aaronheckmann.tumblr.com/post/48943525537/…
Ricardo Tomasi,

2
C'è un modo per nasconderlo dai documenti restituiti dalle query?
Diosney,

6
@diosney query.select('-__v'). @ExplosionPills avresti bisogno di aggiungere middleware mangusta come schema.pre('save', function (next) { this.increment(); next(); }).
wprl,

3
@talentedmrjones @wprl Questo è esattamente quello che sto facendo ora, ma volevo qualcosa che potessi inserire direttamente nello Schema in tutte le domande.
Diosney,

73

Beh, non riesco a vedere la soluzione di Tony ... quindi devo gestirla da solo ...


Se non hai bisogno di version_key, puoi semplicemente:

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

L'impostazione di versionKey su false significa che il documento non è più aggiornato.

Ciò è problematico se il documento contiene una matrice di documenti secondari. Uno dei documenti secondari potrebbe essere eliminato, riducendo le dimensioni dell'array. Successivamente, un'altra operazione potrebbe accedere al documento secondario nella matrice nella posizione originale.

Poiché l'array è ora più piccolo, potrebbe accedere accidentalmente al documento secondario errato nell'array.

VersionKey risolve questo problema associando il documento a a versionKey, utilizzato internamente da mongoose per assicurarsi che acceda alla giusta versione della raccolta.

Ulteriori informazioni sono disponibili all'indirizzo: http://aaronheckmann.blogspot.com/2012/06/mongoose-v3-part-1-versioning.html


31
qual è il risultato dell'impostazione su falso?
xperator,

3
Puoi anche chiamare resultFromMongo.toObject({ versionKey: false })per sovrascrivere il valore.
Leo Gerber,

@xperator il risultato non è un campo __V nello schema: {"_id": {"$ oid": "5aa62e99f36d28237f1a41ad"}, "email": "scott@gmail.com", "sessioni": 0} vs {"_id ": {" $ oid ":" 5aa62e99f36d28237f1a41ad "}," email ":" scott@gmail.com "," sessioni ": 0," __v ": 0}
dang

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

1
qual è il risultato dopo aver impostato false? altro che non si trova nel documento?
Qualcuno di speciale

0

Possiamo usare versionKey: false nella definizione dello schema

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

}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.