MongoDB Academy · पाठ

$addFields, $replaceRoot और $mergeObjects

शिक्षार्थी गणना किए गए फ़ील्ड जोड़ेंगे, नेस्ट किए गए उप-दस्तावेज़ों को मूल स्तर पर लाएँगे और डेटा-प्रवाह के भीतर ऑब्जेक्ट मिलाएँगे।

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

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

दस्तावेज़ का रूप बदलने वाले तीन चरण

जहाँ $project दस्तावेज़ का रूप बदलने का मुख्य टूल है, वहीं तीन अतिरिक्त चरण अधिक लक्षित रूपांतरण प्रदान करते हैं: $addFields सभी मौजूदा फ़ील्ड को बनाए रखते हुए नए फ़ील्ड जोड़ता है, $replaceRoot किसी sub-document को नया root document बना देता है, और $mergeObjects कई objects को एक में मिला देता है। साथ मिलकर, ये ऐसे रूप-परिवर्तन पैटर्न को संभालते हैं जिन्हें केवल $project से लिखना बहुत लंबा या असंभव होता।

$addFields: फ़ील्ड हटाए बिना जोड़ना

$addFields (अपने alias $set के रूप में भी उपलब्ध) दस्तावेज़ के सभी मौजूदा फ़ील्ड आगे भेजता है और केवल निर्दिष्ट फ़ील्ड को जोड़ता या अधिलेखित करता है। यह inclusion mode में $project से मुख्य अंतर है, जहाँ आपको हर उस फ़ील्ड को स्पष्ट रूप से सूचीबद्ध करना पड़ता है जिसे आप रखना चाहते हैं। जब आप हर मौजूदा फ़ील्ड को सूचीबद्ध किए बिना किसी दस्तावेज़ में computed fields जोड़ना चाहें, तब $addFields का उपयोग करें।

// $addFields preserves all existing fields
db.products.aggregate([{
  $addFields: {
    // Add computed fields; all original fields (name, price, etc.) are kept
    totalWithTax: { $multiply: ['$price', 1.1] },
    priceLabel: { $concat: ['$', { $toString: '$price' }] },
    isExpensive: { $gt: ['$price', 1000] }
  }
}]);
// All original product fields PLUS the three new computed fields

$set: $addFields का आधुनिक alias

MongoDB 4.2 में aggregation pipelines और update operations, दोनों में $addFields के alias के रूप में $set प्रस्तुत किया गया। pipeline संदर्भ में दोनों पूरी तरह एक-दूसरे के स्थान पर उपयोग किए जा सकते हैं। $set को आधुनिक और पसंदीदा spelling माना जाता है, क्योंकि यह अधिक सहज है और updateOne() में उपयोग होने वाले $set update operator जैसा है। जो रूप आपको अधिक पठनीय लगे, उसका उपयोग करें।

// $set (modern) and $addFields (classic) are identical
db.orders.aggregate([{
  $set: {  // same as $addFields
    totalWithShipping: { $add: ['$amount', '$shippingFee'] },
    daysToDeliver: {
      $divide: [
        { $subtract: ['$deliveredAt', '$createdAt'] },
        1000 * 60 * 60 * 24
      ]
    }
  }
}]);

$addFields से मौजूदा फ़ील्ड को अधिलेखित करना

जब आप ऐसा फ़ील्ड नाम निर्दिष्ट करते हैं जो दस्तावेज़ में पहले से मौजूद है, तो $addFields मौजूदा मान को अधिलेखित करके नया computed value रखता है। यह डेटा को सामान्य रूप में लाने के लिए उपयोगी है—उदाहरण के लिए, संग्रहीत दस्तावेज़ को बदले बिना pipeline output में किसी string फ़ील्ड को lowercase में बदलना।

// Normalise email to lowercase in pipeline output
db.users.aggregate([{
  $addFields: {
    email: { $toLower: '$email' }  // overwrites existing email field
  }
}]);
// The stored document is unchanged; only the pipeline output is normalised

// Promote a nested field to the top level by overwriting
db.orders.aggregate([{
  $addFields: {
    city: '$shippingAddress.city'  // copy nested field to top level
  }
}]);

$replaceRoot: Sub-Document को root बनाना

$replaceRoot पूरे root document को किसी निर्दिष्ट sub-document या expression से बदल देता है। नया root एक object होना चाहिए। यह तब उपयोगी है जब $lookup + $unwind के बाद आप joined document को मुख्य रूप देना चाहते हों, या parent fields को हटाकर किसी nested sub-document को output document के रूप में सामने लाना चाहते हों।

// Document: { order: { id: 1, amount: 100, customer: { name: 'Alice' } } }

// Make the nested 'order' sub-document the new root
db.transactions.aggregate([{
  $replaceRoot: { newRoot: '$order' }
}]);
// Output: { id: 1, amount: 100, customer: { name: 'Alice' } }
// The outer 'order' wrapper is gone; order's fields are now at the root level

$replaceWith: $replaceRoot का alias

MongoDB 4.2 में $replaceRoot के अधिक संक्षिप्त alias के रूप में $replaceWith प्रस्तुत किया गया। { $replaceRoot: { newRoot: expr } } लिखने के बजाय आप { $replaceWith: expr } लिख सकते हैं। दोनों पूरी तरह समान हैं। joined document को मुख्य परिणाम के रूप में सामने लाने के लिए $lookup/$unwind के बाद अक्सर $replaceWith का उपयोग किया जाता है।

// After lookup + unwind, make the joined product the root
db.orders.aggregate([
  { $lookup: { from: 'products', localField: 'productId', foreignField: '_id', as: 'product' } },
  { $unwind: '$product' },
  // Promote product to root, but keep orderId
  { $replaceWith: {
    $mergeObjects: ['$product', { orderId: '$_id', orderAmount: '$amount' }]
  }}
]);

$mergeObjects: दो objects को मिलाना

$mergeObjects कई objects को एक object में मिला देता है। जब दो objects में एक ही फ़ील्ड हो, तो अंतिम object का मान प्रभावी होता है। इसका उपयोग अक्सर $replaceWith या $addFields के अंदर joined document को समतल करने और उसी समय अतिरिक्त फ़ील्ड जोड़ने के लिए किया जाता है। $mergeObjects objects के array को स्वीकार कर सकता है या $group accumulator के रूप में उपयोग किया जा सकता है।

// Merge two objects - last key wins on conflict
db.users.aggregate([{
  $replaceWith: {
    $mergeObjects: [
      { defaultRole: 'viewer', isActive: false },  // defaults first
      '$$ROOT',                                     // actual doc overrides defaults
      { processedAt: '$$NOW' }                      // add computed field last
    ]
  }
}]);

$group accumulator के रूप में $mergeObjects

$group accumulator के रूप में उपयोग किए जाने पर $mergeObjects किसी समूह के सभी दस्तावेज़ों को एक object में मिला देता है। यह कई आंशिक दस्तावेज़ों को मिलाकर एक पूरा record बनाने के लिए उपयोगी है—उदाहरण के लिए, किसी entity के सभी update events एकत्र करके उन्हें एक single ‘current state’ दस्तावेज़ में मिलाना।

// Merge all update events per entity into one current state
db.events.aggregate([
  { $sort: { timestamp: 1 } },  // process oldest first
  { $group: {
    _id: '$entityId',
    // Merge all event deltas into one object; later events override earlier
    currentState: { $mergeObjects: '$delta' }
  }}
]);
// Each group's 'delta' objects are merged sequentially, last wins

व्यावहारिक पैटर्न: $lookup परिणाम को समतल करना

एक बहुत सामान्य पैटर्न है $replaceWith + $mergeObjects का उपयोग करके lookup किए गए दस्तावेज़ को parent document के root में समतल करना और joined document के फ़ील्ड के साथ parent के प्रासंगिक फ़ील्ड जोड़ना। इससे एक साफ़, flat output object बनता है जिसे serialize करके client को भेजना आसान होता है।

// Flatten order + product into a single output document
db.orders.aggregate([
  { $lookup: {
    from: 'products',
    localField: 'productId',
    foreignField: '_id',
    as: 'product'
  }},
  { $unwind: '$product' },
  { $replaceWith: {
    $mergeObjects: [
      '$product',                            // all product fields at root
      { orderId: '$_id', qty: '$qty', total: { $multiply: ['$product.price', '$qty'] } }
    ]
  }}
]);
// Clean flat output: { name, category, price, orderId, qty, total }

$unset: फ़ील्ड हटाना

$unset (MongoDB 4.2 से उपलब्ध) pipeline में दस्तावेज़ों से विशिष्ट फ़ील्ड हटा देता है। यह $addFields का उलटा है: $addFields अन्य फ़ील्ड को छुए बिना फ़ील्ड जोड़ता है, जबकि $unset निर्दिष्ट फ़ील्ड हटाकर बाकी सबको आगे भेजता है। केवल एक फ़ील्ड को छोड़ने के लिए सभी फ़ील्ड को 1 पर सेट करके $project का उपयोग करने की तुलना में यह अधिक साफ़ तरीका है।

// Remove sensitive fields from output
db.users.aggregate([{
  $unset: ['password', 'apiKey', '__v']  // array of field names to remove
}]);
// All fields except password, apiKey, and __v are passed through

// Remove a single field
db.orders.aggregate([{ $unset: 'internalNotes' }]);

// Remove nested field with dot notation
db.users.aggregate([{ $unset: 'profile.ssn' }]);

$addFields, $replaceRoot और $mergeObjects को मिलाना

ये तीनों चरण उन्नत रूप-परिवर्तन pipelines में साथ मिलकर काम करते हैं। एक सामान्य क्रम यह है: derived fields निकालने के लिए $addFields का उपयोग करें, संबंधित डेटा को जोड़ने के लिए $lookup का उपयोग करें, जॉइन को समतल करने के लिए $unwind का उपयोग करें, फिर साफ़ output shape बनाने के लिए $replaceWith + $mergeObjects का उपयोग करें। यह संयोजन application-side transformation के बिना API response को मनचाहा रूप देने की अधिकांश आवश्यकताओं को पूरा करता है।

db.invoices.aggregate([
  { $addFields: { taxAmount: { $multiply: ['$subtotal', 0.08] } } },
  { $lookup: { from: 'clients', localField: 'clientId', foreignField: '_id', as: 'client' } },
  { $unwind: '$client' },
  { $replaceWith: {
    $mergeObjects: [
      { invoiceId: '$_id', subtotal: '$subtotal', taxAmount: '$taxAmount' },
      { clientName: '$client.name', clientEmail: '$client.email' }
    ]
  }},
  { $unset: ['_id'] }
]);

त्वरित जाँच

$addFields, $replaceRoot और $mergeObjects की अपनी समझ जाँचें।

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

इस पाठ में आपने सीखा: $addFields/$set सभी मौजूदा फ़ील्ड को बनाए रखते हुए फ़ील्ड जोड़ता है, $replaceRoot/$replaceWith किसी sub-document को root बनाता है, और $mergeObjects last-key-wins semantics के साथ कई objects को मिलाता है। अब हम pipeline के परिणामों को collections में लिखने के लिए $out और $merge का अध्ययन करेंगे।

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

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

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

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

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

क्या “$addFields, $replaceRoot और $mergeObjects” पाठ निःशुल्क है?

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

“$addFields, $replaceRoot और $mergeObjects” में मैं क्या सीखूँगा?

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

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

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

“$addFields, $replaceRoot और $mergeObjects” पाठ पूरा करने में कितना समय लगता है?

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

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

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

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

  1. $lookup: डेटा-प्रवाह में संग्रहों को जोड़ना
  2. $unwind: ऐरे फ़ील्ड को अलग करना
  3. $addFields, $replaceRoot और $mergeObjects
  4. $out और $merge: डेटा-प्रवाह परिणाम लिखना
← MongoDB Academy पर वापस जाएँ