2012-02-27 23 views
13

Có cách nào để chuyển đổi trường boolean của MỘT tài liệu trong MongoDB bằng hoạt động nguyên tử không? Nói, (Trong python)Làm thế nào để chuyển đổi một trường boolean trong một tài liệu với hoạt động nguyên tử?

cl.update({"_id": ...}, {"$toggle": {"field": 1}}) 
+0

Hoạt động trên tài liệu riêng biệt là nguyên tử, nhưng hoạt động trên tập hợp tài liệu không phải là nguyên tử. Bạn có nghĩa là bạn cần thay đổi cờ cho tất cả các tài liệu của bộ sưu tập? – Oleg

+0

Xin lỗi tôi đã không làm rõ điều này. Tôi muốn các hoạt động trên tài liệu riêng biệt. – halfjuice

Trả lời

15

Ngay bây giờ, tôi không nghĩ rằng nó có thể làm điều này với một thao tác. Các toán tử bitwise (http://www.mongodb.org/display/DOCS/Updating#Updating-%24bit) không có '$ xor' mặc dù tôi đã vá lỗi cho nó.

Ngay bây giờ workaround Tôi nghĩ nghĩ là bằng cách luôn luôn sử dụng '$ inc':

cl.update({ "_id": ...}, { '$inc' : { 'field' : 1 } });

Sau đó, thay vì kiểm tra đúng hay sai, bạn có thể làm kiểm tra xem một mục là "true":

cl.find({ "_id": ..., 'field' : { '$mod' : [ 2, 1 ] });

IE, bạn sử dụng toán tử modulo để xem liệu nó có đồng đều hay không đồng đều thậm chí bị "bỏ đặt" và không đồng đều "được đặt". Nếu bạn muốn có những hành vi oppposite (ví dụ, tìm tất cả các mục mà không có các thiết lập cờ), sau đó sử dụng

[ 2, 0 ];

+0

Giải pháp tốt, được đề xuất tương tự trong #mongodb;) Vé như là kết quả của cuộc trò chuyện ở đây https://jira.mongodb.org/browse/SERVER-4362 –

4

Vấn đề SERVER-4362 là thực sự giải quyết ngay bây giờ và bạn có các nhà điều hành $bit cập nhật có sẵn. Vì vậy, cùng với nó là xor luận bây giờ bạn có thể làm điều này trong một hành động nguyên tử:

cl.findOneAndUpdate( 
    { "_id": ...}, 
    { 
    "$bit": { 
     "field": { "xor": NumberInt(1) } 
    } 
    }, 
    { "returnNewDocument": true, "upsert": true } 
); 

Vì vậy, miễn là giá trị của trường được lưu giữ tại 0 hoặc 1 sau đó một bitwise "lật" sẽ cho kết quả mà làm cho giá trị hiện tại trái ngược với những gì nó đã được tại thời điểm sửa đổi.

Không yêu cầu .findOneAndUpdate(), nhưng chỉ là một cách chứng minh rằng giá trị kết quả là khác nhau trên mọi sửa đổi.

+4

Có cách nào để sử dụng điều này cho các giá trị boolean thay vì số nguyên không? – mlovic

Các vấn đề liên quan