2012-05-08 11 views
5

Ben böyle çok faydalı $ pozisyonel operatörü kullanarak belirli bir eleman güncelleyebilirsiniz biliyorum 2 dizi elemanını (yanlıştan doğruya)MongoDB'deki bir Array öğesinde bir Boole alanını nasıl değiştirirsiniz?

geçiş istiyorum bu verileri

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

düşünün:

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

Ancak, değer konumu için $ konumsal operatörünü de kullanmanın bir yolu var mı?

örn. bunun gibi?

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

cevap

6

Hayır, şu anda mümkün değil. MongoDB, belgedeki alanlara bağlı olan güncellemelerde ifadelere izin vermez. İki ayrı işlem yapmalı ve ayarlamalısın. Bununla birlikte, tek bir işlemde (ve dolayısıyla atomik olarak) yapmak için bir numara vardır. Bir boole değeri yerine, bir tamsayıya sahip olun. Sonra bile değerler false, tek olanlar - true gösterecektir.

// 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

Teşekkürler, korkuyordum, yani, bu, işlemsel olmayacak demektir, değil mi? –

+2

@ EranMedan: evet, ama bir çözüm var. Güncellenmiş cevaba bakınız. –

İlgili konular