猫鼬中的“ __v”字段是什么


Answers:


295

这里

versionKey是对每个文档设置时,首先由猫鼬创建一个属性。此键值包含文档的内部修订版。此文档属性的名称是可配置的。默认值为__v

如果这与您的应用程序冲突,则可以这样配置:

new Schema({..}, { versionKey: '_somethingElse' })

19
使用此属性确定是否刚刚创建了文档是否安全(例如__v === 0)?
爆炸药

39
@爆炸药以备将来参考:否。仅在可能导致冲突,修改数组位置的操作之后,才增加版本密钥。其他更新不会增加它。最初的发布帖子对其进行了详细说明:aaronheckmann.tumblr.com/post/48943525537/…–
里卡多·托马西

2
有没有办法从查询返回的文档中隐藏它?
diosney 2013年

6
@diosney query.select('-__v')。@ExplosionPills您需要添加猫鼬中间件,例如schema.pre('save', function (next) { this.increment(); next(); })
wprl 2013年

3
@talentedmrjones @wprl正是我现在正在做的,但是我想要可以直接放在Schema中的内容,以便在所有查询中使用。
diosney 2014年

73

好吧,我看不到Tony的解决方案...所以我必须自己解决...


如果您不需要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


31
将其设置为false的结果是什么?
xperator 2015年

3
您也可以呼叫resultFromMongo.toObject({ versionKey: false }),以取消设定值。
Leo Gerber '02

@xperator结果在方案中没有__V字段:{“ _id”:{“ $ oid”:“ 5aa62e99f36d28237f1a41ad”},“ email”:“ scott@gmail.com”,“ sessions”:0} vs {“ _id “:{” $ oid“:” 5aa62e99f36d28237f1a41ad“},” email“:” scott@gmail.com“,” sessions“:0,” __v“:0}
dang

还是这个schema.set('versionKey', false);
Stan Wiechers,

1
设置为false后会有什么结果?除了不在文档中?
某人特别

0

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

}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.