2013-07-23 14 views
8

Từ docs:Mongoose versioning: khi nào thì an toàn để vô hiệu hóa nó?

Các versionKey là 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 thuộc tính tài liệu này có thể cấu hình được. Mặc định là __v. Nếu đây mâu thuẫn với ứng dụng của bạn, bạn có thể cấu hình như vậy:

[...]

Document phiên bản cũng có thể được vô hiệu hóa bằng cách thiết lập versionKey để sai. KHÔNG tắt phiên bản trừ khi bạn biết mình đang làm gì.

Nhưng tôi tò mò, trong trường hợp nào, nên an toàn để vô hiệu hóa tính năng này?

+1

Bài đăng trên blog này nói về trường hợp bạn truy cập các phần tử trong mảng phụ theo vị trí. Nhưng mông cổ thực tế sử dụng id thay vì vị trí. Vì vậy, tôi cũng không chắc chắn: http://aaronheckmann.tumblr.com/post/48943525537/mongoose-v3-part-1-versioning –

Trả lời

20

Mục đích khóa phiên bản là khóa lạc quan.

Khi được bật, giá trị phiên bản sẽ tăng lên bất kỳ khi nào tài liệu được cập nhật.

Điều này cho phép mã ứng dụng của bạn kiểm tra nếu có thay đổi giữa lần tìm nạp (đưa khóa phiên bản 42 chẳng hạn) và cập nhật hậu quả (đảm bảo giá trị phiên bản vẫn là 42). Nếu khóa phiên bản có giá trị khác (ví dụ 43 vì đã cập nhật tài liệu), mã ứng dụng của bạn có thể xử lý sửa đổi đồng thời.

Khái niệm rất giống nhau thường được sử dụng trong cơ sở dữ liệu quan hệ thay vì khóa bi quan có thể mang lại hiệu suất kinh khủng. Tất cả ORM gốc đều cung cấp một tính năng như vậy. Ví dụ, nó được mô tả độc đáo in ObjectDB documentation. Đó là một cơ sở dữ liệu đối tượng được thực hiện trong Java nhưng cũng áp dụng cùng một khái niệm.

blog post được liên kết trong nhận xét của Behlül chứng minh tính hữu ích của khóa lạc quan với ví dụ cụ thể, nhưng chỉ cho các thay đổi mảng, xem bên dưới.

Ở phía đối diện, đây là một trường hợp đơn giản, nơi nó vô dụng: một hồ sơ người dùng có thể được chỉnh sửa bởi chính chủ sở hữu của nó. Ở đây bạn có thể loại bỏ khóa lạc quan và cho rằng chỉnh sửa cuối cùng luôn thắng.

Vì vậy, chỉ bạn mới biết nếu ứng dụng của bạn cần khóa lạc quan hay không. Trường hợp sử dụng theo trường hợp sử dụng.

Tình huống Mongoose có phần đặc biệt.

Khóa tối ưu chỉ được bật cho các mảng vì định dạng bộ nhớ trong sử dụng chỉ mục vị trí. Đây là vấn đề được mô tả bởi blog post được liên kết trong nhận xét của câu hỏi. Tôi tìm thấy số explanation được đưa ra trong danh sách gửi thư mongoose-orm khá rõ ràng: nếu bạn cần khóa lạc quan cho các trường khác, bạn cần tự xử lý nó.

Dưới đây là gist cho biết cách triển khai chiến lược thử lại cho hoạt động add. Một lần nữa, làm thế nào bạn muốn xử lý nó phụ thuộc vào trường hợp sử dụng của bạn, nhưng nó sẽ là đủ để giúp bạn bắt đầu.

Tôi hy vọng điều này sẽ xóa mọi thứ.

Chúc mừng

+1

Chúng ta có cần phiên bản nếu chúng tôi đang sử dụng toán tử '$ in' để truy cập vào các phần phụ. Nó không có vẻ khác với việc truy cập vào tài liệu gốc với tôi. –

+0

Một lần nữa, nó phụ thuộc vào trường hợp sử dụng. Khi sử dụng toán tử $ in, bạn siết chặt cửa sổ sửa đổi đồng thời nhưng hãy nhớ rằng nó vẫn mở. – eskatos

+1

@esKotos Tôi nghĩ câu trả lời mới cập nhật của bạn trông mơ hồ vì phiên bản không hoạt động khi chúng tôi chỉ cập nhật bất kỳ trường nào không phải mảng. –