Mongooseの「__v」フィールドとは


304

私が使用しているMongooseと、バージョン3をMongoDBバージョン2.2。ドキュメントに__vフィールドが表示され始めたことに気づきましたMongoDB。バージョン管理と関係がありますか?使い方は?


結果にそれが必要ない場合は、mongooseフォームから返されたオブジェクトに対して_docを使用します
moein rahimi

回答:


295

ここから:

versionKey最初のマングースによって作成された場合に、各文書に設定されたプロパティです。このキー値には、ドキュメントの内部リビジョンが含まれています。このドキュメントプロパティの名前は構成可能です。デフォルトは__vです。

これがアプリケーションと競合する場合は、次のように構成できます。

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

19
このプロパティを使用して、ドキュメントが作成されたばかりかどうかを判断しても安全__v === 0ですか(例:)?
爆発の丸薬2013

39
@ExplosionPillsは将来の参照用:いいえ。バージョンキーは、競合を引き起こし、配列の位置を変更する可能性がある操作の後にのみ増加します。その他の更新では、増分されません。オリジナルリリース後には詳細にそれを説明する:aaronheckmann.tumblr.com/post/48943525537/...
リカルドTomasiの

2
クエリから返されたドキュメントからそれを隠す方法はありますか?
diosney

6
@diosney query.select('-__v')。@ExplosionPillsのようなマングースミドルウェアを追加する必要がありますschema.pre('save', function (next) { this.increment(); next(); })
wprl 2013

3
@talentedmrjones @wprlこれは今まさに私がやっていることですが、すべてのクエリでスキーマに直接入力できるものを望んでいました。
diosney 14年

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に設定すると、ドキュメントはバージョン管理されなくなります。

ドキュメントにサブドキュメントの配列が含まれている場合、これは問題になります。サブドキュメントの1つを削除して、配列のサイズを小さくすることができます。その後、別の操作で配列内のサブドキュメントに元の位置でアクセスできます。

配列が小さくなったため、配列内の誤ったサブドキュメントに誤ってアクセスする可能性があります。

versionKeyは、mongooseが内部で使用するa versionKeyにドキュメントを関連付けることでこれを解決し、適切なコレクションバージョンにアクセスできるようにします。

詳細については、http//aaronheckmann.blogspot.com/2012/06/mongoose-v3-part-1-versioning.htmlを参照してください。


31
falseに設定した結果はどうなりますか?
xperator 2015年

3
resultFromMongo.toObject({ versionKey: false })値を抑制するためにを呼び出すこともできます。
レオガーバー2017

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

}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.