2012-05-08 10 views
5

इस डेटाMongoDB में एक ऐरे तत्व में एक बूलियन फ़ील्ड को टॉगल कैसे करें?

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

पर विचार करें मैं 2 सरणी तत्व (को असत्य से सत्य)

मैं जानता हूँ कि मैं इस तरह बहुत उपयोगी $ स्थितीय ऑपरेटर का उपयोग किसी विशिष्ट तत्व अद्यतन कर सकते हैं टॉगल करने के लिए करना चाहते हैं:

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

लेकिन क्या मूल्य सेटिंग के लिए $ स्थितित्मक ऑपरेटर का उपयोग करने का कोई तरीका है?

उदा। इस तरह?

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

उत्तर

6

नहीं, इस समय यह संभव नहीं है। MongoDB उन अद्यतनों में अभिव्यक्तियों की अनुमति नहीं देता है जो दस्तावेज़ में फ़ील्ड पर निर्भर करते हैं। आपको दो अलग-अलग परिचालनों में जाना और सेट करना होगा।

हालांकि, वहाँ एक ऑपरेशन (और इसलिए परमाणु) में इसे बनाने के लिए एक चाल है। एक बूलियन मान के बजाय, एक पूर्णांक है। फिर भी मूल्य false, विषम वाले - 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

धन्यवाद, मुझे डर था कि ऐसा है, तो इसका मतलब है, यह लेनदेन नहीं होगा, है ना? –

+2

@EranMedan: हाँ, लेकिन एक कामकाज है। अद्यतन उत्तर देखें। –

संबंधित मुद्दे