आपके कोड में समस्या है dot-notation
क्योंकि जब आप डॉट नोटेशन निर्दिष्ट करते हैं तो आप मानते हैं कि निर्दिष्ट फ़िल्टर मानदंड एकल सरणी तत्व से मेल खाना चाहिए जो सभी मानदंडों को पूरा करता है। लेकिन यह नहीं है। यदि कोई एकल मानदंड मेल खाता है, तो सरणियों पर डॉट नोटेशन किसी भी सरणी तत्व को पिक कर सकता है। इसलिए आपको अप्रत्याशित अपडेट मिल रहा है।
आपको $elemMatch
का उपयोग करना होगा
array
. के सभी फ़िल्टर का मिलान करने के लिए तत्व।
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
}