Що таке поле "__v" у Мангуста


304

Я використовую Mongooseверсію 3 з MongoDBверсією 2.2. Я помітив, що __vполе почало з'являтися в моїх MongoDBдокументах. Це щось стосується версій? Як він використовується?


якщо ви не хочете цього в результаті, використовуйте _doc на поверненому об'єкті форму мангуста
moein rahimi

Відповіді:


295

Від сюди :

Це versionKeyвластивість, встановлена ​​у кожному документі при першому створенні Mongoose. Це значення ключів містить внутрішню редакцію документа. Ім'я цього властивості документа може бути налаштоване. Типовим є __v.

Якщо це суперечить вашій програмі, ви можете налаштувати його як таке:

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

19
Чи безпечно використовувати цю властивість для визначення того, чи був документ щойно створений (наприклад __v === 0)?
Вибухові таблетки

39
@ExplosionPills для подальшого використання: ні. Ключ версії збільшується лише після операцій, які можуть викликати конфлікт, змінюючи положення масиву. Інші оновлення не збільшуватимуть її. Оригінальний пост випуску пояснює його докладно: aaronheckmann.tumblr.com/post/48943525537/…
Рікардо Томасі

2
Чи є спосіб сховати це від повернених документів із запитів?
діосней

6
@diosney query.select('-__v'). @ExplosionPills вам потрібно буде додати мангустне проміжне програмне забезпечення, як-от schema.pre('save', function (next) { this.increment(); next(); }).
wprl

3
@talentedmrjones @wprl Це саме те, що я зараз роблю, але я хотів щось, що я міг би вкласти в схему прямо так, у всіх запитах.
діосней

73

Ну, я не бачу рішення Тоні ... тож я повинен сам впоратися ...


Якщо версія_key вам не потрібна, ви можете просто:

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

Якщо встановити falseKey на помилковому, документ більше не має версії.

Це проблематично, якщо документ містить масив піддокументів. Один із піддокументів можна видалити, зменшивши розмір масиву. Пізніше інша операція могла отримати доступ до піддокумента в масиві у вихідному положенні.

Оскільки масив зараз менший, він може випадково отримати доступ до неправильного піддокумента в масиві.

VersionKey вирішує це, пов'язуючи документ з версією VersionKey, яку внутрішній мангуст використовує для того, щоб переконатися, що він має доступ до потрібної версії колекції.

Більше інформації можна знайти на веб-сайті: http://aaronheckmann.blogspot.com/2012/06/mongoose-v3-part-1-versioning.html


31
який результат встановлення цього значення на помилковому?
xperator

3
Ви також можете зателефонувати resultFromMongo.toObject({ versionKey: false }), щоб перевищити значення.
Лев Гербер

@xperator результат - це не поле __V у схемі: {"_id": {"$ oid": "5aa62e99f36d28237f1a41ad"}, "email": "scott@gmail.com", "session": 0} vs {"_id «: {" $ під'язична ":" 5aa62e99f36d28237f1a41ad "}," електронна пошта ":" scott@gmail.com "," сесії ": 0," __v ": 0}
Данг

або цеschema.set('versionKey', false);
Stan Wiechers

1
що виходить після встановлення значення false? крім того, що його немає в документі?
Хтось особливий

0

Ми можемо використовувати versionKey: false у визначенні схеми

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

}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.