Что такое поле «__v» в Mongoose?


304

Я использую Mongooseверсию 3 с MongoDBверсией 2.2. Я заметил, что __vполе начало появляться в моих MongoDBдокументах. Это как-то связано с версионированием? Как это используется?


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

Ответы:


295

От сюда :

versionKeyЭто свойство устанавливается на каждый документ , когда первый созданный Мангуст. Это значение ключа содержит внутреннюю редакцию документа. Имя этого свойства документа настраивается. По умолчанию это __v.

Если это конфликтует с вашим приложением, вы можете настроить его следующим образом:

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

19
Безопасно ли использовать это свойство, чтобы определить, был ли документ только что создан (например __v === 0)?
Таблетки взрыва

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

2
Есть ли способ скрыть это от возвращенных документов от запросов?
diosney

6
@diosney query.select('-__v'). @ExplosionPills вам нужно будет добавить mongoose middleware, как schema.pre('save', function (next) { this.increment(); next(); }).
wprl

3
@talentedmrjones @wprl Это именно то, что я делаю сейчас, но я хотел что-то, что я мог бы вставить в схему напрямую, так во всех запросах.
diosney

73

Ну, я не вижу решения Тони ... поэтому я должен разобраться с этим сам ...


Если вам не нужен version_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
});

Установка для versionKey значения false означает, что документ больше не является версионным.

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

Поскольку массив теперь меньше, он может случайно получить доступ к неверному поддокументу в массиве.

VersionKey решает эту проблему, связывая документ с ключом versionKey, который внутренне используется в mongoose для обеспечения доступа к нужной версии коллекции.

Дополнительную информацию можно найти по адресу: http://aaronheckmann.blogspot.com/2012/06/mongoose-v3-part-1-versioning.html.


31
каков результат установки его в false?
xperator

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

@xperator результатом является отсутствие поля __V в схеме: {"_id": {"$ oid": "5aa62e99f36d28237f1a41ad"}, "email": "scott@gmail.com", "session": 0} vs {"_id ": {" $ oid ":" 5aa62e99f36d28237f1a41ad "}," электронная почта ":" scott@gmail.com "," session ": 0," __v ": 0}
dang

или этоschema.set('versionKey', false);
Стэн Вичерс

1
что будет после установки на ложь? кроме того, что нет в документе?
Кто-то особенный

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.