Apa bidang “__v” di Mongoose


304

Saya menggunakan Mongooseversi 3 dengan MongoDBversi 2.2. Saya perhatikan ada __vbidang yang mulai muncul di MongoDBdokumen saya . Apakah ada hubungannya dengan versi? Bagaimana ini digunakan?


jika Anda tidak menginginkannya dalam hasil, gunakan _doc pada objek yang dikembalikan berupa luwak
moein rahimi

Jawaban:


295

Dari sini :

Ini versionKeyadalah properti yang ditetapkan pada setiap dokumen saat pertama kali dibuat oleh Mongoose. Nilai kunci ini berisi revisi internal dokumen. Nama properti dokumen ini dapat dikonfigurasi. Standarnya adalah __v.

Jika ini bertentangan dengan aplikasi Anda, Anda dapat mengonfigurasi seperti:

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

19
Apakah aman menggunakan properti ini untuk menentukan apakah suatu dokumen baru saja dibuat (mis. __v === 0)?
Pil Ledakan

39
@ExplosionPills untuk referensi di masa mendatang: no. Kunci versi hanya bertambah setelah operasi yang dapat menyebabkan konflik, memodifikasi posisi array. Pembaruan lainnya tidak akan menambahnya. Posting rilis asli menjelaskannya secara rinci: aaronheckmann.tumblr.com/post/48943525537/…
Ricardo Tomasi

2
Apakah ada cara untuk menyembunyikannya dari dokumen yang dikembalikan dari kueri?
diosney

6
@diosney query.select('-__v'). @ExplosionPills Anda akan perlu menambahkan middleware luwak suka schema.pre('save', function (next) { this.increment(); next(); }).
wprl

3
@talentedmrjones @wprl Itulah yang saya lakukan sekarang, tapi saya ingin sesuatu yang bisa saya masukkan ke Skema secara langsung, jadi di semua pertanyaan.
diosney

73

Yah, saya tidak bisa melihat solusi Tony ... jadi saya harus menanganinya sendiri ...


Jika Anda tidak memerlukan version_key, Anda bisa:

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

Mengatur versionKey ke false berarti dokumen tidak lagi diversi.

Ini bermasalah jika dokumen berisi larik sub dokumen. Salah satu sub dokumen dapat dihapus, mengurangi ukuran array. Kemudian, operasi lain dapat mengakses sub dokumen dalam array di posisi semula.

Karena array sekarang lebih kecil, mungkin secara tidak sengaja mengakses subdocument yang salah dalam array.

VersionKey memecahkan ini dengan mengaitkan dokumen dengan versionKey, yang digunakan oleh luwak secara internal untuk memastikan itu mengakses versi koleksi yang tepat.

Informasi lebih lanjut dapat ditemukan di: http://aaronheckmann.blogspot.com/2012/06/mongoose-v3-part-1-versioning.html


31
apa hasil dari menetapkannya menjadi salah?
xperator

3
Anda juga dapat menelepon resultFromMongo.toObject({ versionKey: false }), untuk mengesampingkan nilainya.
Leo Gerber

@xperator, hasilnya bukan bidang __V dalam skema: {"_id": {"$ oid": "5aa62e99f36d28237f1a41ad"}, "email": "scott@gmail.com", "session": 0} vs {"_id ": {" $ oid ":" 5aa62e99f36d28237f1a41ad "}," email ":" scott@gmail.com "," sesi ": 0," __v ": 0}
dang

atau inischema.set('versionKey', false);
Stan Wiechers

1
apa yang keluar setelah pengaturan ke false? selain itu tidak ada dalam dokumen?
Seseorang Khusus

0

Kita dapat menggunakan versionKey: false dalam definisi Skema

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

}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.