एक परमाणु अद्यतन के साथ संभव नहीं है, मुझे डर है, आपको कुछ अपडेट ऑपरेशंस करना होगा जो दोनों स्थितियों को पूरा करते हैं।
अपडेट लॉजिक को दो अलग-अलग अपडेट ऑपरेशंस में विभाजित करें, पहले वाले को स्थितीय $ ऑपरेटर
history में तत्व की पहचान करने के लिए सरणी जो आप चाहते हैं और $set
मौजूदा क्षेत्रों को अद्यतन करने के लिए। यह कार्रवाई तर्क का पालन करती है यदि नाम और संगठन मेल खाता है तो फ़ील्ड अपडेट करें
अब, आप findAndModify()
इस ऑपरेशन के लिए विधि क्योंकि यह अद्यतन दस्तावेज़ वापस कर सकता है। डिफ़ॉल्ट रूप से, लौटाए गए दस्तावेज़ में अद्यतन पर किए गए संशोधन शामिल नहीं होते हैं।
तो, इस शस्त्रागार से लैस होकर, आप अगले ऑपरेशन में अपने दूसरे तर्क की जांच कर सकते हैं यानी अपडेट करें यदि "history.name" और "history.organisation" का संयोजन सरणी में मौजूद नहीं है उन्हें> . इस दूसरे अपडेट ऑपरेशन के साथ, आपको $push
तत्वों को जोड़ने के लिए ऑपरेटर।
निम्नलिखित उदाहरण उपरोक्त अवधारणा को प्रदर्शित करता है। यह शुरू में मानता है कि आपके पास क्वेरी भाग और दस्तावेज़ को अलग-अलग ऑब्जेक्ट्स के रूप में अपडेट किया जाना है।
उदाहरण के लिए, जब हमारे पास मौजूदा इतिहास सरणी से मेल खाने वाले दस्तावेज़ हैं, तो यह केवल एक अद्यतन कार्रवाई करेगा, लेकिन यदि दस्तावेज़ मेल नहीं खाते हैं, तो findAndModify()
विधि शून्य वापस आ जाएगी, दस्तावेज़ को सरणी में धकेलने के लिए अपने दूसरे अपडेट ऑपरेशन में इस तर्क का उपयोग करें:
var doc = {
"name": "Test123",
"organisation": "Rat"
}, // document to update. Note: the doc here matches the existing array
query = { "email": "example@sqldat.com" }; // query document
query["history.name"] = doc.name; // create the update query
query["history.organisation"] = doc.organisation;
var update = db.users.findAndModify({
"query": query,
"update": {
"$set": {
"history.$.name": doc.name,
"history.$.organisation": doc.organisation
}
}
}); // return the document modified, if there's no matched document update = null
if (!update) {
db.users.update(
{ "email": query.email },
{ "$push": { "history": doc } }
);
}
मेल खाने वाले दस्तावेज़ों के लिए इस ऑपरेशन के बाद, संग्रह को क्वेरी करने से वही मिलेगा
db.users.find({ "email": "example@sqldat.com" });
आउटपुट:
{
"_id" : ObjectId("575fe85bfe98c1fba0a6e535"),
"email" : "example@sqldat.com",
"__v" : 0,
"history" : [
{
"name" : "Test123",
"organisation" : "Rat",
"field" : 4,
"another" : 3
}
]
}
अब उन दस्तावेज़ों पर विचार करें जो मेल नहीं खाएंगे:
var doc = {
"name": "foo",
"organisation": "bar"
}, // document to update. Note: the doc here does not matches the current array
query = { "email": "example@sqldat.com" }; // query document
query["history.name"] = doc.name; // create the update query
query["history.organisation"] = doc.organisation;
var update = db.users.findAndModify({
"query": query,
"update": {
"$set": {
"history.$.name": doc.name,
"history.$.organisation": doc.organisation
}
}
}); // return the document modified, if there's no matched document update = null
if (!update) {
db.users.update(
{ "email": query.email },
{ "$push": { "history": doc } }
);
}
इस दस्तावेज़ के लिए इस संग्रह को क्वेरी करना
db.users.find({ "email": "example@sqldat.com" });
उपज होगा
आउटपुट:
{
"_id" : ObjectId("575fe85bfe98c1fba0a6e535"),
"email" : "example@sqldat.com",
"__v" : 0,
"history" : [
{
"name" : "Test123",
"organisation" : "Rat",
"field" : 4,
"another" : 3
},
{
"name" : "foo",
"organisation" : "bar"
}
]
}