Co to jest pole „__v” w Mongoose

304

Używam Mongoosewersji 3 z MongoDBwersją 2.2. Zauważyłem, że __vw moich MongoDBdokumentach zaczęło pojawiać się pole . Czy to ma coś wspólnego z wersjonowaniem? Jak to jest używane?

Simon Lomax
źródło
jeśli nie chcesz tego w rezultacie użyj _doc na zwróconym obiekcie z mangusty
moein rahimi,

Odpowiedzi:

295

Od tutaj :

versionKeyJest właściwością ustawić na każdym dokumencie po raz pierwszy stworzony przez Mongoose. Ta wartość kluczy zawiera wewnętrzną wersję dokumentu. Nazwę tej właściwości dokumentu można konfigurować. Domyślnie jest to __v.

Jeśli powoduje to konflikt z aplikacją, możesz skonfigurować jako taki:

new Schema({..}, { versionKey: '_somethingElse' })
Tony Lew
źródło
19
Czy można bezpiecznie korzystać z tej właściwości, aby ustalić, czy dokument został właśnie utworzony (np. __v === 0)?
Tabletki przeciwwybuchowe
39
@ExplosionPills do wykorzystania w przyszłości: nie. Klucz wersji jest zwiększany tylko po operacjach, które mogą powodować konflikt, modyfikując pozycje tablic. Inne aktualizacje nie zwiększają tego. Oryginalny post prasowy
Ricardo Tomasi
2
Czy istnieje sposób, aby ukryć go przed zwróconymi dokumentami przed zapytaniami?
diosney
6
@diosney query.select('-__v'). @ExplosionPills należy dodać takie oprogramowanie pośrednie jak mangusta schema.pre('save', function (next) { this.increment(); next(); }).
wprl,
3
@talentedmrjones @wprl To właśnie robię teraz, ale chciałem czegoś, co mógłbym umieścić bezpośrednio w schemacie, więc we wszystkich zapytaniach.
diosney
73

Cóż, nie widzę rozwiązania Tony'ego ... więc muszę sobie z tym poradzić ...


Jeśli nie potrzebujesz wersji_klucza, możesz po prostu:

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

Ustawienie parametru versionKey na false oznacza, że ​​dokument nie jest już wersjonowany.

Jest to problematyczne, jeśli dokument zawiera tablicę dokumentów podrzędnych. Jeden z dokumentów podrzędnych można usunąć, zmniejszając rozmiar tablicy. Później inna operacja może uzyskać dostęp do dokumentu w tablicy w jego pierwotnej pozycji.

Ponieważ tablica jest teraz mniejsza, może przypadkowo uzyskać dostęp do niewłaściwego dokumentu podrzędnego w tablicy.

VersionKey rozwiązuje ten problem, łącząc dokument z kluczem wersji, używanym wewnętrznie przez mangoose, aby mieć pewność, że uzyska dostęp do właściwej wersji kolekcji.

Więcej informacji można znaleźć na stronie : http://aaronheckmann.blogspot.com/2012/06/mongoose-v3-part-1-versioning.html

Kenberkeley
źródło
31
jaki jest wynik ustawienia wartości false?
xperator
3
Możesz także zadzwonić resultFromMongo.toObject({ versionKey: false }), aby zignorować wartość.
Leo Gerber
@ xperator wynikiem nie jest pole __V w schemacie: {"_id": {"$ oid": "5aa62e99f36d28237f1a41ad"}, "email": "[email protected]", "session": 0} vs {"_id „: {„ $ oid ”:„ 5aa62e99f36d28237f1a41ad ”},„ email ”:„ [email protected] ”,„ sesje ”: 0,„ __v ”: 0}
dang
albo toschema.set('versionKey', false);
Stan Wiechers
1
co się dzieje po ustawieniu wartości false? poza tym, że nie ma go w dokumencie?
Ktoś wyjątkowy
0

Możemy użyć versionKey: false w definicji schematu

'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
źródło