394

我正在使用Mongoose版本 3 和MongoDB版本 2.2。我注意到一个__v字段已开始出现在我的MongoDB文档中。它与版本控制有关吗?它是如何使用的?

4

6 回答 6

378

这里

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

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

new Schema({..}, { versionKey: '_somethingElse' })
于 2012-09-19T13:37:29.813 回答
94

好吧,我看不到托尼的解决方案……所以我必须自己处理……


如果您不需要 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

于 2015-08-07T07:47:32.490 回答
12

对于 NestJS 中的删除,需要向Schema()装饰器添加选项

@Schema({ versionKey: false })
于 2021-02-07T12:36:04.827 回答
8

如果不需要,可以禁用版本密钥。

看这个例子:

var User = new mongoose.Schema({
   FullName:{
       type :String,
      
   },
   BirthDay:{
       type :String,
       
   },
   Address:{
       type :String,
   },
   Gender:{
       type:String,
   },
   PhoneNumber:{
       type:Number,
       ref:'Account'
   },
   AccountID:{
        type: Schema.Types.ObjectId,
        ref: 'Account'
   },
   UserName:{
       type:String,
       ref:'Account'
   }
},{collection:'User',
   versionKey: false //here
});
于 2021-05-14T07:22:35.990 回答
2

它是版本密钥。每当进行新的更新时,它都会更新。我个人不喜欢禁用它。

如果您想了解更多信息,请阅读此解决方案 [1]:Mongoose 版本控制:何时禁用它是安全的?

于 2020-09-08T14:30:10.787 回答
0

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

}
于 2019-10-16T08:06:32.183 回答