2012-05-08 45 views
5

xem xét dữ liệu nàyLàm thế nào để chuyển đổi một trường Boolean trong một phần tử mảng trong MongoDB?

{ 
    "_id" : ..., 
    "array" : [ 
     { "name" : "value1","flag" : true } , 
     { "name" : "value2","flag" : false } 
    ] 
} 

Tôi muốn chuyển đổi các yếu tố thứ 2 mảng (từ false thành true)

Tôi biết tôi có thể cập nhật một yếu tố cụ thể bằng cách sử dụng $ hành vị trí rất hữu ích như thế này:

db.myCollection.update(
    {'array.name':'value2'}, 
    { 
     $set: { 
      'array.$.flag':true 
     } 
    },false,true); 

Nhưng có cách nào để sử dụng toán tử vị trí $ cũng cho cài đặt giá trị không?

ví dụ: như thế này?

db.myCollection.update(
    {'array.name':'value2'}, 
    { 
     $set: { 
      'array.$.flag':'!array.$.flag' //<-- 
     } 
    },false,true); 

Trả lời

6

Không, hiện tại không thể. MongoDB không cho phép các biểu thức trong các bản cập nhật phụ thuộc vào các trường trong tài liệu. Bạn sẽ phải nhận và đặt trong hai hoạt động riêng biệt.

Tuy nhiên, có một mẹo để làm cho nó trong một hoạt động (và do đó nguyên tử). Thay vì một giá trị boolean, có một số nguyên. Sau đó, ngay cả các giá trị sẽ đại diện cho false, số lẻ - true.

// get documents with false flag 
db.collection.find({flag: {$mod: [2, 0]}}) 

// get documents with true flag 
db.collection.find({flag: {$mod: [2, 1]}}) 

// toggle flag 
db.collection.update(query, {$inc: {flag: 1}}); 
+0

Xin cảm ơn, tôi sợ nó như vậy, vì vậy nó có nghĩa là, nó sẽ không được giao dịch, phải không? –

+2

@EranMedan: vâng, nhưng có một cách giải quyết khác. Xem câu trả lời được cập nhật. –

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