Trường _Quát ở đâu trong Mongoose


304

Tôi đang sử dụng Mongoosephiên bản 3 với MongoDBphiên bản 2.2. Tôi đã nhận thấy một __vlĩnh vực đã bắt đầu xuất hiện trong các MongoDBtài liệu của tôi . Nó có phải là một cái gì đó để làm với phiên bản? Nó được sử dụng như thế nào?


nếu bạn không muốn nó trong kết quả, hãy sử dụng _doc trên mẫu đối tượng được trả về cầy mangut
moein rahimi

Câu trả lời:


295

Từ đây :

Các versionKeylà một tài sản đặt trên mỗi tài liệu khi lần đầu tiên được tạo ra bởi Mongoose. Giá trị khóa này chứa bản sửa đổi nội bộ của tài liệu. Tên của tài sản tài liệu này là cấu hình. Mặc định là __v.

Nếu điều này mâu thuẫn với ứng dụng của bạn, bạn có thể định cấu hình như sau:

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

19
Có an toàn khi sử dụng thuộc tính này để xác định xem tài liệu vừa được tạo hay không (ví dụ __v === 0)?
Thuốc nổ

39
@ExplumpingPills để tham khảo trong tương lai: không. Khóa phiên bản chỉ được tăng sau khi các thao tác có thể gây xung đột, sửa đổi vị trí mảng. Các cập nhật khác sẽ không làm tăng nó. Bài đăng phát hành ban đầu giải thích chi tiết: aaronheckmann.tumblr.com/post/48943525537/ Lời
Ricardo Tomasi

2
Có cách nào để ẩn nó khỏi các tài liệu được trả về từ các truy vấn không?
diosney

6
@diosney query.select('-__v'). @ExplumpingPills bạn sẽ cần thêm phần mềm trung gian mongoose như thế nào schema.pre('save', function (next) { this.increment(); next(); }).
wprl

3
@talentsmrjones @wprl Đó chính xác là những gì tôi đang làm bây giờ, nhưng tôi muốn một cái gì đó mà tôi có thể đưa vào Schema trực tiếp để trong tất cả các truy vấn.
diosney

73

Chà, tôi không thể thấy giải pháp của Tony ... vì vậy tôi phải tự xử lý nó ...


Nếu bạn không cần version_key, bạn có thể chỉ cần:

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

Đặt phiên bảnKey thành false nghĩa là tài liệu không còn được phiên bản.

Đây là vấn đề nếu tài liệu chứa một mảng các văn bản con. Một trong những văn bản con có thể bị xóa, làm giảm kích thước của mảng. Sau đó, một hoạt động khác có thể truy cập vào văn bản con trong mảng ở vị trí ban đầu.

Vì mảng bây giờ nhỏ hơn, nó có thể vô tình truy cập vào văn bản con sai trong mảng.

VersionKey giải quyết điều này bằng cách liên kết tài liệu với phiên bảnKey, được sử dụng bởi mongoose trong nội bộ để đảm bảo nó truy cập đúng phiên bản bộ sưu tập.

Thông tin chi tiết có thể được tìm thấy tại: http://aaronheckmann.blogspot.com/2012/06/mongoose-v3-part-1-versioning.html


31
kết quả của việc đặt nó thành sai là gì?
xperator

3
Bạn cũng có thể gọi resultFromMongo.toObject({ versionKey: false }), để thay thế giá trị.
Leo Gerber

@xperator kết quả là không có trường __V trong lược đồ: {"_id": {"$ oid": "5aa62e99f36d28237f1a41ad"}, "email": "scott@gmail.com", "session": 0} so với {"_id ": {" $ oid ":" 5aa62e99f36d28237f1a41ad "}," email ":" scott@gmail.com "," phiên ": 0," __v ": 0}
dang

hoặc cái nàyschema.set('versionKey', false);
Stan Wiechers

1
những gì ra sau khi thiết lập thành sai? khác hơn là nó không có trong tài liệu?
Ai đó đặc biệt

0

Chúng ta có thể sử dụng versionKey: false trong định nghĩa 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();
        });
    }

}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.