आप स्थितिगत $
findAndModify()
तरीका। ऑपरेटर सरणी में तत्व की स्थिति को स्पष्ट रूप से निर्दिष्ट किए बिना अद्यतन करने के लिए एक सरणी में तत्व की पहचान करेगा। ध्यान दें, सरणी फ़ील्ड क्वेरी दस्तावेज़ के हिस्से के रूप में दिखाई देनी चाहिए और दस्तावेज़ को अद्यतन पर किए गए संशोधनों के साथ वापस करने के लिए, नए विकल्प का उपयोग करें, ताकि आपका अपडेट ऐसा होगा
db.tests.findAndModify({
query: {
"arr.cond": 4
},
update: {
"$set": {"arr.$.upd": 55 }
},
new : true,
fields: { "arr": 1, "_id": 0 }
})
आउटपुट का उत्पादन करेगा:
{
"arr": [
{
"cond" : 1,
"upd" : 2
},
{
"cond" : 2,
"upd" : 3
},
{
"cond" : 4,
"upd" : 55
},
{
"cond" : 6,
"upd" : 7
},
{
"cond" : 8,
"upd" : 9
}
]
}
चूंकि आप अपडेट किए गए दस्तावेज़ को प्रोजेक्शन के साथ वापस करना चाहते हैं $ प्रक्षेपण
ऑपरेटर का उपयोग केवल find()
. के प्रोजेक्शन दस्तावेज़ में किया जा सकता है विधि या findOne()
विधि इसलिए findAndModify()
का फ़ील्ड
विकल्प $ प्रक्षेपण
ऑपरेटर।
मूल जावास्क्रिप्ट का उपयोग करने के लिए एक समाधान होगा फ़िल्टर ()
var result = db.tests.findAndModify({
query: {
"arr.cond": 4
},
update: {
"$set": {"arr.$.upd": 55 }
},
new : true,
fields: { "arr": 1, "_id": 0 }
})
var updated = []
if (result && result.arr) updated = result.arr.filter(function (item) { return item.cond == 4; });
printjson(updated);
यह प्रिंट होगा
[ { "cond" : 4, "upd" : 55 } ]
-- अपडेट करें --
या $elemMatch
प्रक्षेपण जैसा कि आपने नीचे टिप्पणी में सुझाया है:
var result = db.tests.findAndModify({
query: {
"arr.cond": 4
},
update: {
"$set": {"arr.$.upd": 55 }
},
new : true,
fields: {"arr": {"$elemMatch": { "cond": 4 } }, "_id": 0 }
})
printjson(result);
आउटपुट :
{ "arr" : [ { "cond" : 4, "upd" : 55 } ] }