我使用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()更新)
其他回答
它是版本键。每当有新的更新时,它就会更新。我个人不喜欢禁用它。
如果你想了解更多,请阅读这个解决方案 [1]:猫鼬版本:什么时候关闭它是安全的?
__v字段称为版本键。它描述了文档的内部修订。__v字段用于跟踪文档的修订。默认值为0 (__v:0)。
如果你不想使用这个版本键,你可以像mongoose一样使用versionKey: false。模式参数。
你可以按照这个例子…
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)
我们可以在模式定义中使用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();
});
}
}
“文档”中的“__v”字段服务于“optimisticConcurrency”关注点。
这个术语在猫鼬中基本上是指: 让,你通过'findOne, findById'抓取了一个文档,但没有使用mongoose的save()方法。如果在这个时间间隔内,任何其他代码在第一个文档实例之前抓取相同的文档并使用.save()方法,会怎样呢? 在这个用例中,如果我们想(特定于猫鼬)抛出一个版本错误之类的东西,我们在schema中使用optimisticConcurrency: true选项。
然后mongoose将使用'__v1'来比较这两个文档。
没有optimisticConcurrency: true选项。“__v”没有没有效果。猫鼬不会增加1。
注意:在'findOneAndUpdate'类操作中,不会更新'__v'。(只有save()更新)
我看不出托尼的解决方案……所以我得自己处理
如果你不需要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
推荐文章
- 我如何确定正确的“max-old-space-size”为Node.js?
- npm犯错!代码UNABLE_TO_GET_ISSUER_CERT_LOCALLY
- Access-Control-Allow-Origin不允许Origin < Origin >
- 如何获得所有已注册的快捷路线?
- 你可以为你的组织托管一个私有的存储库来使用npm吗?
- 如何定位父文件夹?
- Gulp命令未找到-安装Gulp后错误
- 在Node.js中写入文件时创建目录
- MongoDB在v4之前不兼容ACID意味着什么?
- 如何将自定义脚本添加到包中。Json文件,运行javascript文件?
- 使用child_process。execSync但保持输出在控制台
- 显示所有集合中的所有内容
- SyntaxError:在严格模式下使用const
- 在Node.js中递归复制文件夹
- 如何在node.js中设置默认时区?