【问题标题】:What is the "__v" field in MongooseMongoose 中的“__v”字段是什么
【发布时间】:2012-09-11 19:57:32
【问题描述】:

我正在使用 Mongoose 版本 3 和 MongoDB 版本 2.2。我注意到__v 字段已开始出现在我的MongoDB 文档中。它与版本控制有关吗?它是如何使用的?

【问题讨论】:

  • 如果您不希望它出现在结果中,请在返回的对象表单 mongoose 上使用 _doc

标签: node.js mongodb mongoose


【解决方案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();
                });
            }
        
        }
        

        【讨论】:

          猜你喜欢
          • 2014-10-14
          • 2012-11-21
          • 2014-09-12
          • 2015-07-07
          • 1970-01-01
          • 2012-12-14
          • 2016-07-03
          • 2019-02-14
          相关资源
          最近更新 更多