MongoDB Academy · पाठ

स्थितीय और फ़िल्टर किए गए स्थितीय अपडेट

शिक्षार्थी $ स्थितीय ऑपरेटर और $[identifier] फ़िल्टर किए गए स्थितीय ऑपरेटर का उपयोग करके मिलान किए गए ऐरे तत्वों को उसी स्थान पर अपडेट करेंगे।

पाठ 4, कुल 4 में से13 चरण

स्थितीय और फ़िल्टर किए गए स्थितीय अपडेट, CoddyKit पर MongoDB Academy का एक निःशुल्क पाठ है। यह 4 में से 4वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह MongoDB Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। MongoDB Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

Arrays के अंदर मौजूद elements को अपडेट करना

जहाँ $push और $pull array elements को जोड़ते और हटाते हैं, वहीं कभी-कभी आपको किसी मौजूदा element को उसी स्थान पर बदलना पड़ता है—अर्थात array में पहले से मौजूद sub-document के अंदर किसी field को बदलना। MongoDB इसके लिए दो positional operators देता है: पहले मेल खाने वाले element को अपडेट करने के लिए $ positional operator, और सभी मेल खाने वाले elements को अपडेट करने के लिए $[identifier] filtered positional operator।

$ Positional Operator

$ positional operator उस पहले array element के index के स्थान पर काम करता है, जो query filter से मेल खाता है। इसे update के field path में 'arrayField.$.subField' की तरह उपयोग किया जाता है और MongoDB $ को मेल खाने वाले element के index से बदल देता है। Query filter में array field पर कोई condition होना आवश्यक है, ताकि MongoDB जान सके कि किस element को लक्ष्य बनाना है।

// Update the grade of the first matching scores element
db.students.updateOne(
  {
    _id: studentId,
    'scores.subject': 'math'  // match condition identifies which element
  },
  {
    $set: { 'scores.$.grade': 'A+' }  // $ = index of matched element
  }
);
// Only the FIRST element where subject='math' is updated

$ Operator की सीमाएँ

$ positional operator की दो महत्वपूर्ण सीमाएँ हैं: यह केवल पहले मेल खाने वाले element को अपडेट करता है, सभी मेल खाने वाले elements को नहीं; और विशिष्ट array elements को कई documents में सुरक्षित रूप से अपडेट करने के लिए इसे updateMany() के साथ उपयोग नहीं किया जा सकता (यह प्रत्येक document में पहला match अपडेट करता है)। सभी मेल खाने वाले elements या कई documents को अपडेट करने के लिए आपको filtered positional operator की आवश्यकता होती है।

// Document: { scores: [{ subject: 'math', pass: false }, { subject: 'math', pass: false }] }

// $ only updates the FIRST math element
db.students.updateOne(
  { _id: id, 'scores.subject': 'math' },
  { $set: { 'scores.$.pass': true } }
);
// Result: [{ subject: 'math', pass: TRUE }, { subject: 'math', pass: FALSE }]
// Second element unchanged!

$[] All Positional Operator

$[] (all positional) operator बिना किसी filter condition के array के सभी elements को अपडेट करता है। यह array के प्रत्येक element के लिए placeholder की तरह काम करता है। इसका उपयोग तब करें जब आप किसी array field के हर element पर एक ही update लागू करना चाहते हों—जैसे status array के सभी flags को reset करना या हर score में bonus amount जोड़ना।

// Give every score a +5 bonus
db.students.updateOne(
  { _id: studentId },
  { $inc: { 'scores.$[].value': 5 } }  // applies to ALL elements
);

// Set pass=true for every element in the array
db.students.updateMany(
  {},
  { $set: { 'scores.$[].reviewed': true } }  // updates across all documents
);

$[identifier] Filtered Positional Operator

$[identifier] filtered positional operator उन सभी array elements को अपडेट करता है, जो arrayFilters option में दी गई condition से मेल खाते हैं। identifier आपके द्वारा चुना गया placeholder नाम है (जैसे elem या score), और arrayFilters option यह निर्धारित करता है कि placeholder किन elements को लक्ष्य बनाए। इससे आपको अपडेट किए जाने वाले elements पर सटीक नियंत्रण मिलता है।

// Update ALL math scores (not just the first)
db.students.updateOne(
  { _id: studentId },
  {
    $set: { 'scores.$[elem].grade': 'A' }  // 'elem' is the identifier
  },
  {
    arrayFilters: [{ 'elem.subject': 'math' }]  // filter for 'elem'
  }
);
// All elements where subject='math' get grade='A'

जटिल arrayFilters conditions

arrayFilters conditions सभी standard MongoDB query operators का समर्थन करती हैं: $gt, $lt, $in, $and और अन्य। array में कई filter objects का उपयोग करके आप nested array updates के लिए कई identifiers परिभाषित कर सकते हैं। प्रत्येक identifier एक अद्वितीय अल्फ़ान्यूमेरिक नाम होना चाहिए, जिसकी शुरुआत lowercase अक्षर से हो।

// Fail all scores below 60 for a student
db.students.updateOne(
  { _id: studentId },
  { $set: { 'scores.$[lowScore].pass': false } },
  { arrayFilters: [{ 'lowScore.value': { $lt: 60 } }] }
);

// Update scores that are math AND below 70
db.students.updateOne(
  { _id: studentId },
  { $set: { 'scores.$[elem].needsHelp': true } },
  {
    arrayFilters: [{
      'elem.subject': 'math',
      'elem.value': { $lt: 70 }
    }]
  }
);

updateMany के साथ Filtered Positional

$ operator के विपरीत, $[identifier] को updateMany() के साथ सुरक्षित रूप से उपयोग करके collection के सभी documents में filtered array updates लागू किए जा सकते हैं। इससे यह bulk operations के लिए अत्यंत शक्तिशाली बन जाता है—जैसे order line items में शामिल विशिष्ट product categories के दाम बदलना, या सभी users के कुछ invoice entries पर discount लागू करना।

// Apply 10% discount to all 'sale' items across ALL orders
db.orders.updateMany(
  {},  // all documents
  { $mul: { 'lineItems.$[item].price': 0.9 } },
  { arrayFilters: [{ 'item.category': 'sale' }] }
);

// Mark all pending tasks as 'overdue' if dueDate has passed
db.projects.updateMany(
  {},
  { $set: { 'tasks.$[t].status': 'overdue' } },
  { arrayFilters: [{ 't.status': 'pending', 't.dueDate': { $lt: new Date() } }] }
);

कई Identifiers के साथ Nested Array Updates

Arrays के अंदर nested arrays के लिए, अलग-अलग nesting levels पर elements को लक्ष्य बनाने हेतु arrayFilters में कई identifiers का उपयोग कर सकते हैं। यह एक उन्नत pattern है—प्रत्येक identifier nesting की अलग गहराई पर लागू होता है। ध्यान रखें कि बहुत गहरे nested array updates जटिल होते हैं और यह संकेत दे सकते हैं कि स्पष्टता के लिए schema को फिर से व्यवस्थित किया जा सकता है।

// Document: { courses: [{ name: 'Math', lessons: [{ id: 1, done: false }] }] }

// Mark a specific lesson as done inside a specific course
db.students.updateOne(
  { _id: studentId },
  { $set: { 'courses.$[course].lessons.$[lesson].done': true } },
  {
    arrayFilters: [
      { 'course.name': 'Math' },     // outer array filter
      { 'lesson.id': 1 }             // inner array filter
    ]
  }
);

Dot Notation से Index के आधार पर अपडेट करना

जब आपको अपडेट किए जाने वाले element का सटीक संख्यात्मक index पता हो, तब आप सीधे dot notation का उपयोग कर सकते हैं: 'array.2.field' तीसरे element को अपडेट करता है (0 से index किया गया)। जब write time पर position ज्ञात हो, तब यह सबसे सीधा तरीका है। इसका उपयोग आम तौर पर fixed-position arrays के लिए किया जाता है, जहाँ प्रत्येक index का निश्चित अर्थ होता है।

// Update the third element (index 2) directly
db.results.updateOne(
  { _id: testId },
  { $set: { 'answers.2.correct': true } }  // update answer at index 2
);

// Set a specific round's score in a game
db.games.updateOne(
  { _id: gameId },
  { $set: { 'rounds.0.score': 150 } }  // update round 1 (index 0)
);

Positional Operators को अन्य Updates के साथ संयोजित करना

जटिल in-place array element modifications करने के लिए positional operators को किसी भी update operator—$set, $inc, $unset, $push—के साथ एक ही atomic operation में संयोजित किया जा सकता है। उदाहरण के लिए, किसी मेल खाने वाले array element के अंदर nested field को बढ़ाते हुए document-level timestamp को भी अपडेट करना।

// Increment attempt count for a specific question in a quiz
db.quizzes.updateOne(
  { _id: quizId, 'questions.id': 'q1' },
  {
    $inc: { 'questions.$.attemptCount': 1 },
    $set: { 'questions.$.lastAttempted': new Date(), updatedAt: new Date() }
  }
);
// All changes are atomic

Redesign कब करें और Positional Operators कब उपयोग करें

Positional updates शक्तिशाली होते हैं, लेकिन जटिल nested positional patterns इस बात का संकेत हो सकते हैं कि आपके schema पर फिर से विचार करने की आवश्यकता है। इन स्थितियों में पुनर्गठन पर विचार करें: आपको कई nested arrays से elements को बार-बार query और update करना पड़ता हो; आप स्वयं को लंबे dot-notation paths लिखते हुए पाते हों; या application logic को runtime पर सटीक element indices निर्धारित करने पड़ते हों। अक्सर nested data को references के साथ अलग collection में ले जाना अधिक सरल और आसानी से maintain किया जा सकता है।

// Schema smells that suggest restructuring:
// 'courses.$[c].lessons.$[l].quizzes.$[q].answers.$.correct'
//   -> 5 levels of nesting is too complex

// Alternative: separate collections with references
// answers collection: { _id, quizId, lessonId, questionIndex, correct }

त्वरित जाँच

Positional और filtered positional update operators की अपनी समझ का परीक्षण करें।

पाठ का पुनरावलोकन

इस पाठ में आपने सीखा: $ query filter द्वारा पहचाने गए पहले मेल खाने वाले array element को अपडेट करता है, $[] बिना किसी condition के सभी array elements को अपडेट करता है, और $[identifier] तथा arrayFilters किसी condition से मेल खाने वाले सभी elements को अपडेट करते हैं। आगे हम aggregation pipeline का अध्ययन करेंगे—यह MongoDB का शक्तिशाली server-side data transformation engine है।

शुरुआत निःशुल्क

एआई शिक्षक के साथ JavaScript सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
30
पाठ
120

अक्सर पूछे जाने वाले प्रश्न

क्या “स्थितीय और फ़िल्टर किए गए स्थितीय अपडेट” पाठ निःशुल्क है?

हाँ—“स्थितीय और फ़िल्टर किए गए स्थितीय अपडेट” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और MongoDB Academy पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। MongoDB Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“स्थितीय और फ़िल्टर किए गए स्थितीय अपडेट” में मैं क्या सीखूँगा?

शिक्षार्थी $ स्थितीय ऑपरेटर और $[identifier] फ़िल्टर किए गए स्थितीय ऑपरेटर का उपयोग करके मिलान किए गए ऐरे तत्वों को उसी स्थान पर अपडेट करेंगे। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ MongoDB Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या MongoDB Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर MongoDB Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 4वाँ पाठ है।

“स्थितीय और फ़िल्टर किए गए स्थितीय अपडेट” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस MongoDB Academy पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर MongoDB Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. ऐरे पर क्वेरी: $all, $size और एलिमेंट मिलान
  2. $elemMatch: ऐरे के उप-दस्तावेज़ों का मिलान
  3. ऐरे अपडेट करना: $push, $pull, $pop, $addToSet
  4. स्थितीय और फ़िल्टर किए गए स्थितीय अपडेट
← MongoDB Academy पर वापस जाएँ