Mongoose 中的“__v”字段是啥
Posted
技术标签:
【中文标题】Mongoose 中的“__v”字段是啥【英文标题】:What is the "__v" field in MongooseMongoose 中的“__v”字段是什么 【发布时间】:2012-09-11 19:57:32 【问题描述】:我正在使用 Mongoose
版本 3 和 MongoDB
版本 2.2。我注意到__v
字段已开始出现在我的MongoDB
文档中。它与版本控制有关吗?它是如何使用的?
【问题讨论】:
如果您不希望它出现在结果中,请在返回的对象表单 mongoose 上使用 _doc 【参考方案1】:来自here:
versionKey
是首次创建时在每个文档上设置的属性 由猫鼬。此键值包含 文档。此文档属性的名称是可配置的。这 默认为__v
。如果这与您的应用程序冲突,您可以这样配置:
new Schema(.., versionKey: '_somethingElse' )
【讨论】:
使用该属性来确定文档是否刚刚创建是否安全(例如__v === 0
)?
@ExplosionPills 供将来参考:否。只有在可能导致冲突、修改数组位置的操作之后,版本键才会增加。其他更新不会增加它。原发布帖有详细解释:aaronheckmann.tumblr.com/post/48943525537/…
有没有办法从查询返回的文档中隐藏它?
@diosney query.select('-__v')
。 @ExplosionPills 你需要添加像 schema.pre('save', function (next) this.increment(); next(); )
这样的猫鼬中间件。
@talentedmrjones @wprl 这正是我现在正在做的事情,但我想要一些可以直接放入架构中的东西所有个查询。【参考方案2】:
好吧,我看不到托尼的解决方案……所以我必须自己处理……
如果您不需要 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
【讨论】:
设置为 false 的结果是什么? 你也可以调用resultFromMongo.toObject( versionKey: false )
,隐藏值。
@xperator 结果是方案中没有 __V 字段: "_id": "$oid": "5aa62e99f36d28237f1a41ad" , "email": "scott@gmail.com", "sessions ": 0 vs "_id": "$oid": "5aa62e99f36d28237f1a41ad" , "email": "scott@gmail.com", "sessions": 0, "__v": 0
或者这个schema.set('versionKey', false);
设置为false后的结果是什么?除了它不在文档中?【参考方案3】:
对于在 NestJS 中删除需要添加选项到 Schema()
装饰器
@Schema( versionKey: false )
【讨论】:
【参考方案4】:如果不需要,可以禁用版本密钥。
看这个例子:
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
);
【讨论】:
【参考方案5】:这是版本密钥。每当进行新的更新时,它都会更新。我个人不喜欢禁用它。
如果您想了解更多信息,请阅读此解决方案 [1]:Mongoose versioning: when is it safe to disable it?
【讨论】:
【参考方案6】:我们可以在 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();
);
【讨论】:
以上是关于Mongoose 中的“__v”字段是啥的主要内容,如果未能解决你的问题,请参考以下文章
Mongoose.js 除了 _id & __v 默认来自查询结果