MongoDB Academy · पाठ

API प्रतिक्रियाओं के लिए प्रोजेक्शन की सर्वोत्तम प्रथाएँ

शिक्षार्थी ऐसे प्रोजेक्शन डिज़ाइन करेंगे जो REST API प्रतिक्रिया प्रारूप से मेल खाते हों, पेलोड का आकार घटाते हों और संवेदनशील फ़ील्ड की सुरक्षा करते हों।

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

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

प्रक्षेपणों को API प्रतिक्रिया के आकार के अनुरूप बनाएँ

आपका एप्लिकेशन जिस भी REST या GraphQL एंडपॉइंट को उजागर करता है, उसका एक निर्धारित प्रतिक्रिया आकार होता है। आदर्श MongoDB प्रक्षेपण में उस आकार के लिए आवश्यक ठीक फ़ील्ड होने चाहिए—न अधिक, न कम। जब आपका प्रक्षेपण API प्रतिक्रिया अनुबंध के अनुरूप होता है, तो आप दो सामान्य गलत विधियों से बचते हैं: आवश्यकता से अधिक डेटा प्राप्त करना (ऐसे फ़ील्ड लौटाना जिन्हें एंडपॉइंट कभी नहीं भेजता) और आवश्यकता से कम डेटा प्राप्त करना (ऐसे फ़ील्ड लौटाना जिनके लिए दूसरी क्वेरी करनी पड़े)।

प्रक्षेपण स्थिरांक परिभाषित करें

हर क्वेरी में प्रक्षेपण ऑब्जेक्ट को सीधे लिखने से समय के साथ दोहराव और असंगतियाँ बढ़ती हैं। अपने डेटा एक्सेस फ़ंक्शन या रिपॉज़िटरी के साथ प्रक्षेपण स्थिरांक परिभाषित करें। यदि API प्रतिक्रिया का आकार बदलता है, तो कोडबेस में हर क्वेरी खोजने के बजाय आपको केवल एक स्थिरांक अपडेट करना होगा।

// projections.js — centralised projection definitions
export const USER_PUBLIC = { _id: 0, username: 1, avatarUrl: 1, createdAt: 1 };
export const USER_PROFILE = { _id: 0, username: 1, email: 1, bio: 1, avatarUrl: 1 };
export const USER_ADMIN = { _id: 0, username: 1, email: 1, role: 1, lastLoginAt: 1, isActive: 1 };

// Usage
const user = await db.collection('users').findOne({ username: 'alice' }, { projection: USER_PROFILE });

संवेदनशील फ़ील्ड क्लाइंट को कभी न लौटाएँ

passwordHash, totpSecret, apiKey, ssn और paymentMethodToken जैसे फ़ील्ड कभी भी API प्रतिक्रियाओं में दिखाई नहीं देने चाहिए। एक सुरक्षित आधारभूत प्रक्षेपण परिभाषित करें जो डिफ़ॉल्ट रूप से इन्हें बाहर रखे, और इन्हें केवल उन आंतरिक सेवा कॉल में प्राप्त करें जिन्हें इनकी विशेष आवश्यकता हो। डेटा स्तर पर न्यूनतम विशेषाधिकार के सिद्धांत को लागू करें।

// Always exclude sensitive fields from user queries
const SECURE_USER_BASE = {
  passwordHash: 0,
  totpSecret: 0,
  resetToken: 0
};

// All user API responses go through this projection
const user = await db.collection('users').findOne(
  { _id: userId },
  { projection: SECURE_USER_BASE }
);

// Result never contains passwordHash or totpSecret

सूची एंडपॉइंट: केवल सारांश फ़ील्ड का प्रक्षेपण करें

सूची एंडपॉइंट (जैसे, GET /products) आमतौर पर प्रत्येक आइटम का पूरा दस्तावेज़ नहीं, बल्कि उसका सारांश लौटाते हैं। किसी उत्पाद की सूची में name, price, thumbnailUrl और rating दिखाए जा सकते हैं—पूरा description, specifications ऐरे या reviews नहीं। सूची क्वेरी के लिए सीमित प्रक्षेपण का उपयोग करने से, जब पूरे दस्तावेज़ों में बड़ा पाठ या बड़े ऐरे हों, डेटा आकार 90% तक कम हो सकता है।

const PRODUCT_SUMMARY = {
  _id: 0,
  slug: 1,
  name: 1,
  price: 1,
  thumbnailUrl: 1,
  rating: 1,
  reviewCount: 1
};

// GET /products — lightweight list query
const products = await db.collection('products')
  .find({ category: 'electronics', isActive: true })
  .projection(PRODUCT_SUMMARY)
  .sort({ rating: -1 })
  .limit(20)
  .toArray();

विवरण एंडपॉइंट: पूरा ऑब्जेक्ट प्रक्षेपित करें

विवरण एंडपॉइंट (जैसे, GET /products/:slug) किसी एक दस्तावेज़ का अधिक विस्तृत रूप लौटाते हैं। यहाँ भी केवल आंतरिक उपयोग वाले फ़ील्ड हटाने पर विचार करें। आप सभी सार्वजनिक फ़ील्ड प्रक्षेपित कर सकते हैं, लेकिन आंतरिक लागत मूल्य, आपूर्तिकर्ता के संपर्क विवरण या ऐसी इन्वेंटरी स्रोत प्रणाली आईडी छिपा सकते हैं जिन्हें क्लाइंट को नहीं देखना चाहिए।

const PRODUCT_DETAIL = {
  supplierCost: 0,       // internal — never expose to clients
  warehouseLocation: 0,  // internal
  syncedFromErpAt: 0     // internal audit field
};

// GET /products/:slug — rich detail query
const product = await db.collection('products').findOne(
  { slug: req.params.slug, isActive: true },
  { projection: PRODUCT_DETAIL }
);

एग्रीगेशन पाइपलाइन में भी प्रक्षेपणों का उपयोग करें

प्रक्षेपण की सर्वोत्तम विधियाँ एग्रीगेशन पाइपलाइन पर भी लागू होती हैं। दस्तावेज़ का आकार कम करने के लिए $match के बाद और $lookup या $unwind जैसे महँगे चरणों से पहले $project चरण रखें। पाइपलाइन में छोटे दस्तावेज़ होने से सर्वर पर कम मेमोरी और CPU का उपयोग होता है।

db.orders.aggregate([
  { $match: { status: 'shipped', customerId: ObjectId('c1') } },
  // Project early to reduce document size before $lookup
  { $project: { total: 1, createdAt: 1, customerId: 1, _id: 0 } },
  {
    $lookup: {
      from: 'customers',
      localField: 'customerId',
      foreignField: '_id',
      as: 'customer'
    }
  }
]);

प्रक्षेपण और API संस्करण निर्धारण

जब आप MongoDB दस्तावेज़ों में नए फ़ील्ड जोड़ते हैं, तो पुराने API क्लाइंट उन्हें अपेक्षित रूप से न पहचानें। सख्त समावेशन प्रक्षेपण का उपयोग करने पर (लौटाए जाने वाले फ़ील्ड की सटीक सूची देने पर) नए दस्तावेज़ फ़ील्ड मौजूदा API उपभोक्ताओं के लिए तब तक अदृश्य रहते हैं जब तक आप उन्हें प्रक्षेपण में स्पष्ट रूप से न जोड़ें। इससे आपको स्वाभाविक संस्करण सीमा मिलती है: API संस्करण अपडेट करते समय प्रक्षेपण भी अपडेट करें।

// v1 projection — stable contract for existing clients
export const USER_V1 = { _id: 0, username: 1, email: 1 };

// v2 projection — includes new avatarUrl and bio fields
export const USER_V2 = { _id: 0, username: 1, email: 1, avatarUrl: 1, bio: 1 };

जाँचें कि प्रक्षेपण प्रतिक्रिया स्कीमा से मेल खाते हैं

ऐसी यूनिट जाँचें लिखें जो यह सुनिश्चित करें कि MongoDB प्रक्षेपण ऑब्जेक्ट आपके API प्रतिक्रिया स्कीमा (जैसे Joi स्कीमा या TypeScript प्रकार) से मेल खाता है। इससे वह सामान्य त्रुटि रुकती है जिसमें डेवलपर API प्रतिक्रिया प्रकार में फ़ील्ड जोड़ देता है, लेकिन उसे प्रक्षेपण में जोड़ना भूल जाता है—उत्पादन में फ़ील्ड undefined लौटता है, जबकि TypeScript प्रकार जाँच सफल रहती है।

// Example test asserting projection covers all required response fields
const USER_RESPONSE_FIELDS = ['username', 'email', 'avatarUrl'];
const projection = { username: 1, email: 1, avatarUrl: 1, _id: 0 };

for (const field of USER_RESPONSE_FIELDS) {
  if (projection[field] !== 1) {
    throw new Error('Projection missing field: ' + field);
  }
}
console.log('Projection covers all required response fields');

Mongoose में प्रक्षेपण असंगति से बचना

किसी फ़ील्ड पर select: false वाले Mongoose स्कीमा उस फ़ील्ड को किसी भी क्वेरी परिणाम में आने से रोकते हैं, जब तक उसे स्पष्ट रूप से फिर से शामिल न किया जाए। इसे स्कीमा-स्तरीय वर्चुअल फ़ील्ड के साथ मिलाकर ऐसे व्युत्पन्न मानों की गणना करें जिन्हें संग्रहीत करने की आवश्यकता नहीं होती। साथ मिलकर ये उपकरण आपको मॉडल स्तर पर एक सुरक्षित डिफ़ॉल्ट प्रक्षेपण लागू करने देते हैं और अनुपस्थित क्वेरी प्रक्षेपण के कारण डेटा के अनजाने में लीक होने की संभावना घटाते हैं।

const userSchema = new mongoose.Schema({
  username: String,
  email:    String,
  // Excluded from all queries by default — must explicitly use +passwordHash
  passwordHash: { type: String, select: false },

  // Virtual — computed, not stored, never in DB
  get displayName() { return this.username.toUpperCase(); }
});
userSchema.virtual('displayName').get(function() {
  return this.username.toUpperCase();
});

प्रक्षेपण की दक्षता की निगरानी

अपने प्रक्षेपण सही ढंग से काम कर रहे हैं या नहीं, यह जाँचने के लिए explain('executionStats')

का उपयोग करें। nReturned बनाम keysExamined और docsExamined का अनुपात देखें। यदि docsExamined मेल खाने वाले दस्तावेज़ों की संख्या के बराबर है (शून्य नहीं), तो आपका प्रक्षेपण किसी इंडेक्स द्वारा कवर नहीं किया गया है, लेकिन फिर भी सही है—आप यह तय कर सकते हैं कि कवर करने वाला इंडेक्स जोड़ना उसके रखरखाव की लागत के योग्य है या नहीं।

const result = await db.collection('users').find(
  { role: 'admin' },
  { projection: { username: 1, email: 1, _id: 0 } }
).explain('executionStats');

console.log('Docs examined:', result.executionStats.totalDocsExamined);
console.log('Keys examined:', result.executionStats.totalKeysExamined);
console.log('Docs returned:', result.executionStats.nReturned);

सारांश: प्रक्षेपण की सर्वोत्तम विधियों की जाँच-सूची

अपने API की हर MongoDB क्वेरी पर यह जाँच-सूची लागू करें:

  • नामित प्रक्षेपण स्थिरांक परिभाषित करें — प्रत्येक एंडपॉइंट या प्रतिक्रिया आकार के लिए एक
  • API प्रतिक्रियाओं के लिए समावेशन मोड का उपयोग करें — केवल आवश्यक फ़ील्ड की सटीक सूची दें
  • संवेदनशील फ़ील्ड हमेशा बाहर रखें — passwordHash, tokens, आंतरिक आईडी
  • सूची एंडपॉइंट के लिए सीमित प्रक्षेपण का उपयोग करें — केवल सारांश, कोई बड़ा मुख्य भाग नहीं
  • एग्रीगेशन पाइपलाइन में $project को आरंभ में रखें — आगे भेजे जाने वाले डेटा को कम करें

त्वरित जाँच

इस पाठ से MongoDB और NoSQL Databases की अवधारणाओं के बारे में अपनी समझ जाँचें।

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

इस पाठ में आपने सीखा: असंगतियों को रोकने के लिए प्रत्येक API एंडपॉइंट के लिए प्रक्षेपण स्थिरांक परिभाषित किए जाने चाहिए, क्लाइंट को दिखाई देने वाली क्वेरी से संवेदनशील फ़ील्ड हमेशा बाहर रखे जाने चाहिए, और एग्रीगेशन पाइपलाइन में $project को आरंभ में रखने से मेमोरी पर दबाव कम होता है। आगे हम बड़े परिणाम समूहों को कुशलतापूर्वक क्रमबद्ध करने और पृष्ठों में बाँटने के लिए क्रमबद्ध करने और पृष्ठांकन का अध्ययन करेंगे।

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

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

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

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

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

क्या “API प्रतिक्रियाओं के लिए प्रोजेक्शन की सर्वोत्तम प्रथाएँ” पाठ निःशुल्क है?

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

“API प्रतिक्रियाओं के लिए प्रोजेक्शन की सर्वोत्तम प्रथाएँ” में मैं क्या सीखूँगा?

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

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

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

“API प्रतिक्रियाओं के लिए प्रोजेक्शन की सर्वोत्तम प्रथाएँ” पाठ पूरा करने में कितना समय लगता है?

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

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

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

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

  1. समावेशन बनाम बहिष्करण प्रोजेक्शन
  2. नेस्टेड और ऐरे फ़ील्ड का प्रोजेक्शन
  3. $ और $elemMatch ऐरे प्रोजेक्शन
  4. API प्रतिक्रियाओं के लिए प्रोजेक्शन की सर्वोत्तम प्रथाएँ
← MongoDB Academy पर वापस जाएँ