我正在使用Mongoose版本3和MongoDB版本2.2。我注意到__v字段开始出现在我的MongoDB文档中。这与版本控制有关吗?它是如何使用的?
Mongoose
MongoDB
__v
从在这里:
versionKey是第一次创建时在每个文档上设置的属性 猫鼬。属性的内部修订 文档。此文档属性的名称是可配置的。的 .默认为__v 如果这与你的应用程序冲突,你可以这样配置:
versionKey
如果这与你的应用程序冲突,你可以这样配置:
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通过将文档与mongoose内部使用的a versionKey相关联来解决这个问题,以确保它访问正确的集合版本。
更多信息可以在http://aaronheckmann.blogspot.com/2012/06/mongoose-v3-part-1-versioning.html找到
我们可以在模式定义中使用versionKey:假
'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(); }); } }
它是版本键。每当有新的更新时,它就会更新。我个人不喜欢禁用它。
阅读这个解决方案,如果你想知道更多 [1]: 猫鼬版本控制:什么时候关闭它是安全的? < / p >
在NestJS中删除需要添加选项Schema()装饰器
Schema()
@Schema({ versionKey: false })
如果您不需要版本键,可以禁用它。
请看这个例子:
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 });
__v字段称为版本键。它描述了文档的内部修订。__v字段用于跟踪文档的修订。默认值为0 (__v:0)。
__v:0
如果你不想使用这个版本键,你可以使用versionKey: false作为mongoose.Schema参数。
versionKey: false
mongoose.Schema
你可以按照这个例子…
const mongoose = require('mongoose'); const userSchema = mongoose.Schema( { name: { type: String, require: true }, email: { type: String, unique: true }, password: { type: String, } }, { timestamps: true, versionKey: false, // Here You have to add. } ) module.exports = mongoose.model('tbl_user', userSchema)
“文档”中的“__v”字段服务于“optimisticConcurrency””关注点。
这个术语在猫鼬中基本上意味着: let,你通过'findOne, findById'抓取了一个文档,但是不使用了mongoose的save()方法。如果在这个时间间隔内,任何其他代码在第一个文档实例之前抓取相同的文档并使用.save()方法,会怎样呢? 在这个用例中,如果我们想(特定于猫鼬)抛出一个版本错误之类的东西,我们在schema中使用optimisticConcurrency: true选项
optimisticConcurrency: true
然后mongoose将使用'__v1'来比较这两个文档。
没有optimisticConcurrency: true选项。“__v”没有没有效果。猫鼬不会增加1。
注意:在'findOneAndUpdate'类操作中,不会更新'__v'。(只有save()更新)