Was ist das Feld "__v" in Mongoose?


304

Ich verwende MongooseVersion 3 mit MongoDBVersion 2.2. Ich habe festgestellt __v, dass in meinen MongoDBDokumenten ein Feld angezeigt wird . Hat das etwas mit Versionierung zu tun? Wie wird es benutzt?


Wenn Sie es nicht im Ergebnis haben möchten, verwenden Sie _doc auf dem zurückgegebenen Objektformular Mungo
Moein Rahimi

Antworten:


295

Von hier aus :

Dies versionKeyist eine Eigenschaft, die für jedes Dokument festgelegt wurde, wenn es zum ersten Mal von Mongoose erstellt wurde. Dieser Schlüsselwert enthält die interne Revision des Dokuments. Der Name dieser Dokumenteigenschaft ist konfigurierbar. Der Standardwert ist __v.

Wenn dies mit Ihrer Anwendung in Konflikt steht, können Sie Folgendes konfigurieren:

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

19
Ist es sicher, mit dieser Eigenschaft festzustellen, ob gerade ein Dokument erstellt wurde (z. B. __v === 0)?
Explosion Pills

39
@ExplosionPills als zukünftige Referenz: Nein. Der Versionsschlüssel wird nur nach Vorgängen erhöht, die einen Konflikt verursachen und die Array-Positionen ändern können. Andere Updates erhöhen es nicht. Der ursprüngliche Veröffentlichungsbeitrag erklärt es ausführlich: aaronheckmann.tumblr.com/post/48943525537/…
Ricardo Tomasi

2
Gibt es eine Möglichkeit, es vor den zurückgegebenen Dokumenten in den Abfragen zu verbergen?
Diosney

6
@ Diosney query.select('-__v'). @ExplosionPills müssten Sie Mungo Middleware wie hinzufügen schema.pre('save', function (next) { this.increment(); next(); }).
wprl

3
@talentedmrjones @wprl Genau das mache ich jetzt, aber ich wollte etwas, das ich direkt in das Schema einfügen kann, also in alle Abfragen.
Diosney

73

Nun, ich kann Tonys Lösung nicht sehen ... also muss ich mich selbst darum kümmern ...


Wenn Sie version_key nicht benötigen, können Sie einfach:

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

Wenn Sie den versionKey auf false setzen, wird das Dokument nicht mehr versioniert.

Dies ist problematisch, wenn das Dokument ein Array von Unterdokumenten enthält. Eines der Unterdokumente könnte gelöscht werden, wodurch die Größe des Arrays verringert wird. Später könnte eine andere Operation an der ursprünglichen Position auf das Unterdokument im Array zugreifen.

Da das Array jetzt kleiner ist, kann es versehentlich auf das falsche Unterdokument im Array zugreifen.

Der versionKey löst dieses Problem, indem er das Dokument mit einem versionKey verknüpft, der von Mungo intern verwendet wird, um sicherzustellen, dass auf die richtige Sammlungsversion zugegriffen wird.

Weitere Informationen finden Sie unter: http://aaronheckmann.blogspot.com/2012/06/mongoose-v3-part-1-versioning.html


31
Was ist das Ergebnis einer falschen Einstellung?
Xperator

3
Sie können auch anrufen resultFromMongo.toObject({ versionKey: false }), um den Wert zu unterdrücken.
Leo Gerber

@xperator das Ergebnis ist kein __V-Feld im Schema: {"_id": {"$ oid": "5aa62e99f36d28237f1a41ad"}, "email": "scott@gmail.com", "session": 0} vs {"_id ": {" $ oid ":" 5aa62e99f36d28237f1a41ad "}," email ":" scott@gmail.com "," session ": 0," __v ": 0}
dang

oder dasschema.set('versionKey', false);
Stan Wiechers

1
Was kommt heraus, nachdem auf false gesetzt wurde? außer dass es nicht im Dokument ist?
Jemand Besonderes

0

Wir können versionKey: false in der Schemadefinition verwenden

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

}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.