नेस्टेड और ऐरे फ़ील्ड का प्रोजेक्शन
शिक्षार्थी ऐरे और नेस्टेड उप-दस्तावेज़ों के हिस्सों का प्रोजेक्शन करने के लिए डॉट नोटेशन और $slice ऑपरेटर का उपयोग करेंगे।
नेस्टेड और ऐरे फ़ील्ड का प्रोजेक्शन, CoddyKit पर MongoDB Academy का एक निःशुल्क पाठ है। यह 4 में से 2वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह MongoDB Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। MongoDB Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
डॉट नोटेशन से नेस्टेड फ़ील्ड का प्रोजेक्शन
एम्बेड किए गए सब-दस्तावेज़ से किसी विशिष्ट फ़ील्ड का प्रोजेक्शन करने के लिए, प्रोजेक्शन कुंजी में डॉट नोटेशन का उपयोग करें। उदाहरण के लिए, यदि किसी दस्तावेज़ में address सब-दस्तावेज़ है, तो आप पूरे address ऑब्जेक्ट को लौटाए बिना केवल address.city का प्रोजेक्शन कर सकते हैं। MongoDB नेस्टेड पथ को पार करके केवल निर्दिष्ट अंतिम फ़ील्ड लौटाता है और परिणाम में पैरेंट फ़ील्ड का आवरण बनाए रखता है।
// Document shape: { name, address: { street, city, zip }, email }
const user = await db.collection('users').findOne(
{ email: 'alice@example.com' },
{ projection: { name: 1, 'address.city': 1, _id: 0 } }
);
// Result: { name: 'Alice', address: { city: 'Austin' } }
// street and zip are excluded; only city is returned inside addressनेस्टेड फ़ील्ड को बाहर रखना
शीर्ष-स्तरीय फ़ील्ड की तरह, आप सब-दस्तावेज़ के बाकी हिस्से को लौटाते हुए विशिष्ट नेस्टेड फ़ील्ड को बाहर रख सकते हैं। 'address.zip': 0 का उपयोग करने पर पूरे address ऑब्जेक्ट के साथ zip फ़ील्ड को छोड़कर बाकी सब लौटता है। यह नेस्टेड ऑब्जेक्ट के बाकी हिस्से को क्लाइंट के सामने रखते हुए आंतरिक उपयोग वाले सब-फ़ील्ड छिपाने के लिए उपयोगी है।
// Return everything except address.zip
const user = await db.collection('users').findOne(
{ email: 'alice@example.com' },
{ projection: { 'address.zip': 0, passwordHash: 0 } }
);
// Result includes address.street and address.city but not address.zipप्रोजेक्शन में एरे फ़ील्ड
जब प्रोजेक्ट किया गया फ़ील्ड एरे होता है, तो MongoDB डिफ़ॉल्ट रूप से पूरा एरे लौटाता है। यदि किसी user दस्तावेज़ में दस तत्वों वाला tags एरे है, तो tags: 1 का प्रोजेक्शन सभी दस तत्व लौटाता है। एरे का कितना भाग लौटाया जाए, इसे नियंत्रित करने के लिए आपको $slice, $ या $elemMatch की आवश्यकता होती है—ये एरे के लिए विशेष तीन प्रोजेक्शन ऑपरेटर हैं।
// Returns the entire tags array
const post = await db.collection('posts').findOne(
{ slug: 'intro-to-mongodb' },
{ projection: { title: 1, tags: 1, _id: 0 } }
);
// Result: { title: '...', tags: ['mongodb', 'nosql', 'tutorial', ...] }$slice से एरे के हिस्से निकालना
$slice प्रोजेक्शन ऑपरेटर लौटाए जाने वाले एरे तत्वों की संख्या सीमित करता है। पहले N तत्व लौटाने के लिए धनात्मक पूर्णांक दें, या अंतिम N तत्व लौटाने के लिए ऋणात्मक पूर्णांक दें। आप [skip, limit] जैसा दो-तत्वों वाला एरे भी दे सकते हैं, जिससे कुछ तत्व छोड़कर अगले N तत्व लौटाए जाते हैं। एरे की सामग्री को पृष्ठों में बाँटने या उसका पूर्वावलोकन करने का सबसे सरल तरीका $slice है।
// Return only the first 3 comments from a post
db.posts.findOne(
{ slug: 'intro-to-mongodb' },
{ projection: { title: 1, comments: { $slice: 3 } } }
);
// Return the last 5 comments
db.posts.findOne(
{ slug: 'intro-to-mongodb' },
{ projection: { title: 1, comments: { $slice: -5 } } }
);
// Skip 10 comments, then return the next 5
db.posts.findOne(
{ slug: 'intro-to-mongodb' },
{ projection: { title: 1, comments: { $slice: [10, 5] } } }
);नेस्टेड एरे सब-फ़ील्ड का प्रोजेक्शन
समावेशन प्रोजेक्शन में डॉट नोटेशन का उपयोग करके आप सब-दस्तावेज़ों के एरे के अंदर मौजूद किसी फ़ील्ड का प्रोजेक्शन कर सकते हैं। उदाहरण के लिए, किसी orders दस्तावेज़ में items एरे हो सकता है, जिसके प्रत्येक तत्व में productId, qty और price हों। 'items.qty': 1 का प्रोजेक्शन पूरा items एरे लौटाता है, लेकिन प्रत्येक तत्व के अंदर केवल qty फ़ील्ड रखता है।
// Return items array with only the qty field in each element
db.orders.findOne(
{ _id: ObjectId('o1') },
{ projection: { 'items.qty': 1, 'items.productId': 1, _id: 0 } }
);
// Result:
// { items: [{ productId: ObjectId('p1'), qty: 2 }, { productId: ObjectId('p2'), qty: 1 }] }नेस्टेड एरे सब-फ़ील्ड को बाहर रखना
इसी तरह, आप एरे तत्वों से विशिष्ट सब-फ़ील्ड बाहर रख सकते हैं। उदाहरण के लिए, किसी employees collection में एरे के प्रत्येक तत्व के अंदर मौजूद compensation सब-दस्तावेज़ में salary रखी जा सकती है। 'positions.compensation': 0 का प्रोजेक्शन positions एरे लौटाता है, लेकिन प्रत्येक तत्व से संवेदनशील compensation डेटा हटा देता है।
// Exclude compensation from every element of the positions array
db.employees.findOne(
{ name: 'Alice' },
{ projection: { 'positions.compensation': 0 } }
);एकाधिक नेस्टेड पथों का प्रोजेक्शन
एक ही प्रोजेक्शन में आप समान सब-दस्तावेज़ या एरे से कई नेस्टेड फ़ील्ड का प्रोजेक्शन कर सकते हैं। डॉट नोटेशन वाला प्रत्येक पथ स्वतंत्र होता है। यह संयोजनशीलता आपको दस्तावेज़ के उसी उप-वृक्ष को सटीक रूप से निकालने देती है जिसकी आपकी क्वेरी को आवश्यकता है, जिससे प्रतिक्रिया का आकार बढ़ाने वाला अप्रासंगिक नेस्टेड डेटा वापस नहीं आता।
// Get shipping address city and order total only
db.orders.find(
{ status: 'shipped' },
{
projection: {
'shippingAddress.city': 1,
'shippingAddress.country': 1,
total: 1,
_id: 0
}
}
);गहरे नेस्टेड डॉट नोटेशन
डॉट नोटेशन कई स्तरों तक जा सकता है। यदि किसी दस्तावेज़ में meta.seo.keywords है, तो आप ठीक उसी पथ का प्रोजेक्शन कर सकते हैं। MongoDB बाहरी आवरण वाले फ़ील्ड (meta और seo) लौटाएगा, लेकिन केवल keywords अंतिम फ़ील्ड शामिल करेगा और हर स्तर पर बाकी सहोदर फ़ील्ड हटा देगा।
// Document: { title, meta: { seo: { keywords: [...], description: '...' }, author: '...' } }
db.articles.findOne(
{ slug: 'my-article' },
{ projection: { title: 1, 'meta.seo.keywords': 1, _id: 0 } }
);
// Result: { title: '...', meta: { seo: { keywords: [...] } } }
// meta.seo.description and meta.author are excludedनेस्टेड फ़ील्ड के लिए प्रोजेक्शन और इंडेक्स कवरेज
किसी क्वेरी को कवर किए जाने के लिए, यानी दस्तावेज़ों को छुए बिना पूरी तरह इंडेक्स से पूरा किए जाने के लिए, प्रोजेक्शन में केवल इंडेक्स में मौजूद फ़ील्ड शामिल होने चाहिए, जिनमें नेस्टेड फ़ील्ड भी शामिल हैं। { 'address.city': 1, name: 1 } वाला compound index ऐसी क्वेरी को कवर कर सकता है जो address.city पर फ़िल्टर लगाती है और केवल address.city तथा name का प्रोजेक्शन करती है, साथ में _id: 0। कवर की गई क्वेरी सबसे कम संभव विलंबता देती हैं।
// Create an index on nested field
db.users.createIndex({ 'address.city': 1, name: 1 });
// Covered query — both filter and projection are inside the index
db.users.find(
{ 'address.city': 'Austin' },
{ projection: { 'address.city': 1, name: 1, _id: 0 } }
).explain('executionStats');
// totalDocsExamined should be 0Mongoose में $slice
Mongoose के क्वेरी बिल्डर में $slice का कोई मूल शॉर्टहैंड नहीं है, लेकिन आप सीधे प्रोजेक्शन ऑब्जेक्ट दे सकते हैं। यदि आप ऑब्जेक्ट पास कर रहे हैं, तो Mongoose के .select() कॉल के अंदर { fieldName: { $slice: N } } का उपयोग करें, या प्रोजेक्शन को .find() के दूसरे तर्क के रूप में दें। ड्राइवर इसे बिना किसी बदलाव के MongoDB को भेज देता है।
// Mongoose: return title and first 5 comments using $slice
const post = await Post.findOne(
{ slug: 'intro-to-mongodb' },
{ title: 1, comments: { $slice: 5 }, _id: 0 }
);
// Alternatively as a Mongoose query
const post2 = await Post
.findOne({ slug: 'intro-to-mongodb' })
.select({ title: 1, comments: { $slice: 5 }, _id: 0 });नेस्टेड प्रोजेक्शन की सामान्य सावधानियाँ
एक सामान्य समस्या यह है कि एरे में मौजूद नेस्टेड फ़ील्ड का प्रोजेक्शन करने के लिए डॉट नोटेशन का उपयोग करना पड़ता है, लेकिन MongoDB एरे का पूरा आवरण लौटाता है। आप इंडेक्स के आधार पर अलग-अलग एरे तत्वों का प्रोजेक्शन नहीं कर सकते (जैसे, items.0 प्रोजेक्शन में केवल पहला तत्व नहीं चुनता—इसके लिए $slice: 1 का उपयोग करें)। साथ ही, एक ही पथ में पैरेंट फ़ील्ड और चाइल्ड फ़ील्ड, दोनों का प्रोजेक्शन नहीं किया जा सकता: या तो address का प्रोजेक्शन करें या address.city का, दोनों का नहीं।
त्वरित जाँच
इस पाठ से MongoDB और NoSQL Database की अवधारणाओं की अपनी समझ जाँचें।
पाठ का पुनरावलोकन
इस पाठ में आपने सीखा: डॉट नोटेशन से सब-दस्तावेज़ों और एरे से विशिष्ट नेस्टेड फ़ील्ड का प्रोजेक्शन किया जाता है, $slice लौटाए जाने वाले एरे तत्वों की संख्या सीमित करता है, और नेस्टेड एरे सब-फ़ील्ड का प्रोजेक्शन प्रत्येक एरे तत्व के अंदर केवल निर्दिष्ट अंतिम फ़ील्ड शामिल करता है। आगे हम एरे से एक मेल खाने वाला तत्व लौटाने के लिए $ और $elemMatch एरे प्रोजेक्शन देखेंगे।
एआई शिक्षक के साथ JavaScript सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 30
- पाठ
- 120
अक्सर पूछे जाने वाले प्रश्न
क्या “नेस्टेड और ऐरे फ़ील्ड का प्रोजेक्शन” पाठ निःशुल्क है?
हाँ—“नेस्टेड और ऐरे फ़ील्ड का प्रोजेक्शन” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और MongoDB Academy पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। MongoDB Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“नेस्टेड और ऐरे फ़ील्ड का प्रोजेक्शन” में मैं क्या सीखूँगा?
शिक्षार्थी ऐरे और नेस्टेड उप-दस्तावेज़ों के हिस्सों का प्रोजेक्शन करने के लिए डॉट नोटेशन और $slice ऑपरेटर का उपयोग करेंगे। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ MongoDB Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या MongoDB Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर MongoDB Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 2वाँ पाठ है।
“नेस्टेड और ऐरे फ़ील्ड का प्रोजेक्शन” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस MongoDB Academy पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर MongoDB Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- समावेशन बनाम बहिष्करण प्रोजेक्शन
- नेस्टेड और ऐरे फ़ील्ड का प्रोजेक्शन
- $ और $elemMatch ऐरे प्रोजेक्शन
- API प्रतिक्रियाओं के लिए प्रोजेक्शन की सर्वोत्तम प्रथाएँ