提问者:小点点

猫鼬的“__V”字段是什么


我使用的是Mongooseversion3和MongoDBversion2.2。我注意到一个__v字段开始出现在我的MongoDB文档中。这和版本控制有关吗?它是如何使用的?


共3个答案

匿名用户

从这里开始:

VersionKey是Mongoose首次创建时在每个文档上设置的属性。此keys值包含文档的内部修订。此文档属性的名称是可配置的。默认值为__v

如果这与您的应用程序冲突,您可以这样配置:

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

匿名用户

嗯,我看不出托尼的解决方案。。。所以我得自己处理。。。

如果您不需要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通过将文档与a versionKey关联来解决这个问题,mongoose在内部使用a versionKey来确保它访问正确的集合版本。

更多信息请访问:http://aaronheckmann.blogspot.com/2012/06/mongoose-v3-part-1-versioning.html

匿名用户

我们可以在模式定义中使用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();
        });
    }

}