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?

Simon Lomax
sumber
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' })
Tony The Lion
sumber
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

kenberkeley
sumber
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": "[email protected]", "session": 0} vs {"_id ": {" $ oid ":" 5aa62e99f36d28237f1a41ad "}," email ":" [email protected] "," 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();
        });
    }

}
KARTHIKEYAN.A
sumber