2012-02-12 11 views
12

से विशिष्ट तत्व अद्यतन मैं एक निम्न स्कीमा के साथ एक संग्रह है:MongoDB subarray

{ 
    "_id" : 28, 
    "n" : [{ 
     "a" : ObjectId("4ef8466e46b3b8140e000000"), 
     "c" : 28, 
     "p" : [ObjectId("4f00640646b3b88005000003"), ObjectId("4f00640146b3b88005000002"), ObjectId("4f00637d46b3b8cc0e000001"), ObjectId("4f00638046b3b8cc0e000002"), ObjectId("4f00638246b3b8cc0e000003"), ObjectId("4f00631646b3b85002000001"), ObjectId("4f00631846b3b85002000002")], 
     "u" : 26 
    }, { 
     "a" : ObjectId("4ef8466e46b3b8140e000000"), 
     "c" : 10, 
     "p" : [ObjectId("4f00640146b3b88005000002"), ObjectId("4f0063fd46b3b88005000001")], 
     "u" : 26 
    }, { 
     "a" : ObjectId("4ef8467846b3b8780d000001"), 
     "u" : 26, 
     "p" : [ObjectId("4f00637b46b3b8cc0e000000")], 
     "c" : 28 
    }, { 
     "a" : ObjectId("4ef85a3e46b3b84408000000"), 
     "u" : 26, 
     "p" : [ObjectId("4f00631046b3b85002000000")], 
     "c" : 28 
    }] 
} 

मैं _ id = 28 लेकिन साथ दस्तावेज़ में सरणी में तत्वों में से एक अद्यतन करने की आवश्यकता केवल एक अगर = कुछ मूल्य और ग = कुछ मूल्य

db.coll.update({ 
'_id' : 28, 
'n.a' : new ObjectId('4ef85a3e46b3b84408000000'), 
'n.c' : 28 
}, 
{ 
    $push : { 
    'n.$.p' : ObjectId("4b97e62bf1d8c7152c9ccb74") 
    }, 
    $set : { 
    'n.$.t' : ISODate("2013-05-13T14:22:46.777Z") 
    } 
}) 

तो बुनियादी तौर पर मैं सरणी से विशिष्ट तत्व अपडेट करना चाहते हैं: और जहाँ तक एक देख सकते हैं, इस चौथे तत्व है। समस्या यह है कि जब क्वेरी निष्पादित हो रही है, तो यह संभवतः पहले तत्व को अद्यतन करता है।

मैं इसे कैसे ठीक कर सकता हूं?

उत्तर

23

आपके कोड में समस्या dot-notation है क्योंकि जब आप डॉट नोटेशन निर्दिष्ट करते हैं तो आप मानते हैं कि निर्दिष्ट फ़िल्टर मानदंडों को एकल सरणी तत्व से मेल खाना चाहिए जो सभी मानदंडों को पूरा करता है। लेकिन यह नहीं करता है। यदि कोई भी मानदंड मेल खाता है तो सरणी पर डॉट नोटेशन किसी भी सरणी तत्व को पिकअप कर सकता है। आपको अनपेक्षित अपडेट क्यों मिल रहा है।

array तत्व में सभी फ़िल्टरों से मेल खाने के लिए आपको $elemMatch का उपयोग करना होगा।

db.coll.update({ 
'_id' : 28, 
n: { 
    $elemMatch:{ 
     a : new ObjectId('4ef85a3e46b3b84408000000'), 
     c : 28 } 
    } 
}, 
{ 
    $push : { 
    'n.$.p' : ObjectId("4b97e62bf1d8c7152c9ccb74") 
    }, 
    $set : { 
    'n.$.t' : ISODate("2013-05-13T14:22:46.777Z") 
    } 
}) 

और आउटपुट

{ 
     "a" : ObjectId("4ef85a3e46b3b84408000000"), 
     "c" : 28, 
     "p" : [ 
      ObjectId("4f00631046b3b85002000000"), 
      ObjectId("4b97e62bf1d8c7152c9ccb74") 
     ], 
     "t" : ISODate("2013-05-13T14:22:46.777Z"), 
     "u" : 26 
    } 
है