Node.js 什么是「__v";猫鼬场

Node.js 什么是「__v";猫鼬场,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我正在使用Mongooseversion3和MongoDBversion2.2。我注意到在我的MongoDB文档中开始出现一个\uv字段。这与版本控制有关吗?它是如何使用的?来自: versionKey是第一次创建文档时在每个文档上设置的属性 猫鼬。此keys值包含的是 文件。此文档属性的名称是可配置的。这个 默认值为\uv 如果这与您的应用程序冲突,您可以进行如下配置: 我看不到Tony的解决方案…所以我必须自己处理 如果不需要版本密钥,您可以: var UserSchema = new m

我正在使用
Mongoose
version3和
MongoDB
version2.2。我注意到在我的
MongoDB
文档中开始出现一个
\uv
字段。这与版本控制有关吗?它是如何使用的?

来自:

versionKey
是第一次创建文档时在每个文档上设置的属性 猫鼬。此keys值包含的是 文件。此文档属性的名称是可配置的。这个 默认值为
\uv

如果这与您的应用程序冲突,您可以进行如下配置:


我看不到Tony的解决方案…所以我必须自己处理


如果不需要版本密钥,您可以:

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在内部使用versionKey来确保它访问正确的集合版本


更多信息请访问:

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

}

它是版本密钥。每当进行新更新时,它都会更新。我个人不喜欢禁用它

如果您想了解更多信息,请阅读此解决方案
[1] :

要在NestJS中删除,需要向Shema()装饰器添加选项

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

使用此属性确定文档是否刚刚创建(例如,
\uu v==0
)是否安全?@ExplosionPills供将来参考:否。版本密钥仅在可能导致冲突的操作后增加,修改数组位置。其他更新不会增加它。原始版本的帖子对此进行了详细解释:有没有办法对查询返回的文档隐藏它?@diosney
query.select('-\uv')
@您需要添加mongoose中间件,如
schema.pre('save',function(next){this.increment();next();})
@talentedmrjones@wprl这正是我现在正在做的事情,但是我想要一些可以在所有查询中直接放入模式的内容。将其设置为false的结果是什么?您也可以调用
resultFromMongo.toObject({versionKey:false})
,以超过该值。@xperator结果是模式中没有{u V字段:{u id:{$oid 5aa62e99f36d2837f1a41ad},“email”: "scott@gmail.com“,“会话”:0}vs{u id:{“$oid:“5aa62e99f36d28237f1a41ad”},电子邮件:”scott@gmail.com“,“sessions”:0,“\uu v”:0}或此
schema.set('versionKey',false)设置为false后的结果是什么?除了它不在文档中之外?如果您不想在结果中使用它,请在返回的对象表单mongoose上使用_doc
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
});