我正在使用Mongoose
版本 3 和MongoDB
版本 2.2。我注意到一个__v
字段已开始出现在我的MongoDB
文档中。它与版本控制有关吗?它是如何使用的?
6 回答
从这里:
这
versionKey
是由 Mongoose 首次创建时在每个文档上设置的属性。此键值包含文档的内部修订。此文档属性的名称是可配置的。默认值为__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 通过将文档与 versionKey 相关联来解决这个问题,mongoose 在内部使用它来确保它访问正确的集合版本。
更多信息请访问:http ://aaronheckmann.blogspot.com/2012/06/mongoose-v3-part-1-versioning.html
对于 NestJS 中的删除,需要向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
});
它是版本密钥。每当进行新的更新时,它都会更新。我个人不喜欢禁用它。
如果您想了解更多信息,请阅读此解决方案 [1]:Mongoose 版本控制:何时禁用它是安全的?
我们可以在 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();
});
}
}