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


当前回答

“文档”中的“__v”字段服务于“optimisticConcurrency”关注点。

这个术语在猫鼬中基本上是指: 让,你通过'findOne, findById'抓取了一个文档,但没有使用mongoose的save()方法。如果在这个时间间隔内,任何其他代码在第一个文档实例之前抓取相同的文档并使用.save()方法,会怎样呢? 在这个用例中,如果我们想(特定于猫鼬)抛出一个版本错误之类的东西,我们在schema中使用optimisticConcurrency: true选项。

然后mongoose将使用'__v1'来比较这两个文档。

没有optimisticConcurrency: true选项。“__v”没有没有效果。猫鼬不会增加1。

注意:在'findOneAndUpdate'类操作中,不会更新'__v'。(只有save()更新)

其他回答

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

}

如果您不需要版本键,可以禁用它。

请看这个例子:

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

从这里开始:

versionKey是第一次创建时在每个文档上设置的属性 猫鼬。属性的内部修订 文档。此文档属性的名称是可配置的。的 默认值是__v。 如果这与你的应用程序冲突,你可以这样配置:

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

“文档”中的“__v”字段服务于“optimisticConcurrency”关注点。

这个术语在猫鼬中基本上是指: 让,你通过'findOne, findById'抓取了一个文档,但没有使用mongoose的save()方法。如果在这个时间间隔内,任何其他代码在第一个文档实例之前抓取相同的文档并使用.save()方法,会怎样呢? 在这个用例中,如果我们想(特定于猫鼬)抛出一个版本错误之类的东西,我们在schema中使用optimisticConcurrency: true选项。

然后mongoose将使用'__v1'来比较这两个文档。

没有optimisticConcurrency: true选项。“__v”没有没有效果。猫鼬不会增加1。

注意:在'findOneAndUpdate'类操作中,不会更新'__v'。(只有save()更新)

它是版本键。每当有新的更新时,它就会更新。我个人不喜欢禁用它。

如果你想了解更多,请阅读这个解决方案 [1]:猫鼬版本:什么时候关闭它是安全的?