ฟิลด์“ __v” ใน Mongoose คืออะไร


304

ฉันใช้Mongooseเวอร์ชัน 3 กับMongoDBเวอร์ชัน 2.2 ฉันสังเกตเห็นว่า__vเขตข้อมูลเริ่มปรากฏในMongoDBเอกสารของฉัน มันเกี่ยวกับเวอร์ชันหรือไม่? มันใช้งานอย่างไร?


ถ้าคุณไม่ต้องการในผลลัพธ์ให้ใช้ _doc ในรูปแบบของวัตถุที่ส่งคืนพังพอน
moein rahimi

คำตอบ:


295

จากที่นี่ :

versionKeyเป็นชุดทรัพย์สินในเอกสารแต่ละตอนแรกที่สร้างขึ้นโดยพังพอน ค่าของคีย์นี้ประกอบด้วยการแก้ไขภายในของเอกสาร ชื่อของคุณสมบัติเอกสารนี้สามารถกำหนดค่าได้ __vเริ่มต้นคือ

หากสิ่งนี้ขัดแย้งกับแอปพลิเคชันของคุณคุณสามารถกำหนดค่าดังนี้:

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

19
ปลอดภัยไหมที่จะใช้คุณสมบัตินี้เพื่อพิจารณาว่าเอกสารเพิ่งสร้างขึ้น (เช่น__v === 0) หรือไม่?
ยาระเบิดใน

39
@ExplosionPills สำหรับการอ้างอิงในอนาคต: ไม่ คีย์เวอร์ชันจะเพิ่มขึ้นหลังจากการดำเนินการที่อาจทำให้เกิดข้อขัดแย้งและแก้ไขตำแหน่งอาร์เรย์ การปรับปรุงอื่น ๆ จะไม่เพิ่มขึ้น โพสต์ต้นฉบับจะอธิบายในรายละเอียด: aaronheckmann.tumblr.com/post/48943525537/ …
Ricardo Tomasi

2
มีวิธีซ่อนจากเอกสารที่ส่งคืนจากแบบสอบถามหรือไม่
diosney

6
query.select('-__v')@diosney @ExplosionPills schema.pre('save', function (next) { this.increment(); next(); })คุณจะต้องเพิ่มตัวกลางเช่นพังพอน
wprl

3
@talentedmrjones @wprlนั่นคือสิ่งที่ฉันกำลังทำอยู่ตอนนี้ แต่ฉันต้องการสิ่งที่ฉันสามารถใส่ลงใน Schema โดยตรงในทุกข้อสงสัย
diosney

73

ฉันไม่เห็นทางออกของโทนี่ ... ดังนั้นฉันต้องจัดการเอง ...


หากคุณไม่ต้องการ 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
ผลลัพธ์ของการตั้งค่าเป็นเท็จคืออะไร
xperator

3
นอกจากนี้คุณยังสามารถโทรหาresultFromMongo.toObject({ versionKey: false })เพื่อเอาชนะค่า
Leo Gerber

@xperator ผลลัพธ์ไม่ใช่ฟิลด์ __V ในรูปแบบ: {"_id": {"$ oid": "5aa62e99f36d28237f1a41ad"}, "อีเมล": "scott@gmail.com", "เซสชัน": 0} vs {"_id ": { "$ OID": "5aa62e99f36d28237f1a41ad"}, "อีเมล": "scott@gmail.com", "การประชุม": 0, "__v": 0}
แดง

หรือนี่schema.set('versionKey', false);
Stan Wiechers

1
สิ่งที่ออกมาหลังจากตั้งค่าเป็นเท็จ นอกเหนือจากที่ไม่ได้อยู่ในเอกสาร?
คนพิเศษ

0

เราสามารถใช้versionKey: falseในการกำหนด Schema

'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();
        });
    }

}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.