Qu'est-ce que le champ «__v» dans Mongoose

304

J'utilise la Mongooseversion 3 avec la MongoDBversion 2.2. J'ai remarqué qu'un __vchamp commençait à apparaître dans mes MongoDBdocuments. Est-ce quelque chose à voir avec la gestion des versions? Comment est-ce utilisé?

Simon Lomax
la source
si vous ne le voulez pas dans le résultat, utilisez _doc sur l'objet retourné sous forme mangouste
moein rahimi

Réponses:

295

D' ici :

Le versionKeyest une propriété située sur chaque document créé lors de la première par Mongoose. Cette valeur de clés contient la révision interne du document. Le nom de cette propriété de document est configurable. La valeur par défaut est__v .

Si cela entre en conflit avec votre application, vous pouvez configurer comme tel:

new Schema({..}, { versionKey: '_somethingElse' })
Tony le lion
la source
19
Est-il sûr d'utiliser cette propriété pour déterminer si un document vient d'être créé (par exemple __v === 0)?
Pilules d'explosion
39
@ExplosionPills pour référence future: non. La clé de version n'est incrémentée qu'après des opérations susceptibles de provoquer un conflit, modifiant les positions du tableau. Les autres mises à jour ne l'incrémenteront pas. Le post de sortie original l'explique en détail: aaronheckmann.tumblr.com/post/48943525537/…
Ricardo Tomasi
2
Existe-t-il un moyen de le cacher des documents retournés des requêtes?
diosney
6
@diosney query.select('-__v'). @ExplosionPills, vous devez ajouter un middleware mangouste comme schema.pre('save', function (next) { this.increment(); next(); }).
wprl
3
@talentedmrjones @wprl C'est exactement ce que je fais maintenant, mais je voulais quelque chose que je pourrais mettre directement dans le schéma, donc dans toutes les requêtes.
diosney
73

Eh bien, je ne vois pas la solution de Tony ... donc je dois la gérer moi-même ...


Si vous n'avez pas besoin de version_key, vous pouvez simplement:

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

La définition de versionKey sur false signifie que le document n'est plus versionné.

Cela pose problème si le document contient un tableau de sous-documents. Un des sous-documents a pu être supprimé, réduisant la taille du tableau. Plus tard, une autre opération pourrait accéder au sous-document dans le tableau à sa position d'origine.

Étant donné que le tableau est maintenant plus petit, il peut accidentellement accéder au mauvais sous-document du tableau.

La versionKey résout ce problème en associant le document à la versionKey, utilisée par la mangouste en interne pour s'assurer qu'il accède à la bonne version de la collection.

Plus d'informations peuvent être trouvées sur: http://aaronheckmann.blogspot.com/2012/06/mongoose-v3-part-1-versioning.html

kenberkeley
la source
31
quel est le résultat de la mise à faux?
xperator
3
Vous pouvez également appeler resultFromMongo.toObject({ versionKey: false }), pour supprimer la valeur.
Leo Gerber
@xperator le résultat n'est pas un champ __V dans le schéma: {"_id": {"$ oid": "5aa62e99f36d28237f1a41ad"}, "email": "[email protected]", "sessions": 0} vs {"_id ": {" $ oid ":" 5aa62e99f36d28237f1a41ad "}," email ":" [email protected] "," sessions ": 0," __v ": 0}
dang
ou cecischema.set('versionKey', false);
Stan Wiechers
1
quel est le résultat après avoir réglé sur faux? à part qu'il ne figure pas dans le document?
Quelqu'un de spécial
0

Nous pouvons utiliser versionKey: false dans la définition de schéma

'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
la source