प्रक्षेपण उपयोग में अंतर कुछ हद तक सूक्ष्म है। आपके उदाहरण के उपयोग में, ये समान प्रश्न होने चाहिए (सूचकांक उपयोग के संदर्भ में) लेकिन $elemMatch
उदाहरण अनावश्यक रूप से क्वेरी मानदंड दोहराता है। $
इस उदाहरण के लिए प्रोजेक्शन अधिक समझदार विकल्प होगा।
दस्तावेज़ीकरण में नोट किया गया एक आवश्यक अंतर सरणी है। क्षेत्र की सीमा
$
. के लिए अनुमान:
नीचे प्रोजेक्शन ऑपरेटरों में अंतर पर कुछ और नोट्स ...
द ) प्रोजेक्शन ऑपरेटर :
-
क्वेरी दस्तावेज़ से मेल खाने वाले पहले तत्व को शामिल करने के लिए क्वेरी परिणामों में शामिल सरणी फ़ील्ड की सामग्री को सीमित करता है।
-
यह आवश्यक है कि मिलान करने वाली सरणी फ़ील्ड क्वेरी मानदंड में शामिल हो
-
केवल तभी उपयोग किया जा सकता है जब क्वेरी मानदंड में एक एकल सरणी फ़ील्ड दिखाई दे
-
प्रक्षेपण में केवल एक बार उपयोग किया जा सकता है
द $elemMatch
प्रोजेक्शन ऑपरेटर
-
एक सरणी फ़ील्ड की सामग्री को सीमित करता है जो क्वेरी परिणामों में शामिल होती है जिसमें केवल पहला सरणी तत्व होता है जो $elemMatch स्थिति से मेल खाता है ।
-
मिलान करने वाले सरणी को क्वेरी मानदंड में होने की आवश्यकता नहीं है
-
एम्बेड किए गए दस्तावेज़ों वाले सरणी तत्वों के लिए एकाधिक स्थितियों से मेल खाने के लिए उपयोग किया जा सकता है
द $elemMatch
क्वेरी ऑपरेटर
ध्यान दें कि एक $elemMatch
. भी है क्वेरी ऑपरेटर जो समान मिलान करता है, लेकिन परिणाम प्रक्षेपण के बजाय क्वेरी में। इसे $
. के संयोजन में उपयोग करते हुए देखना असामान्य नहीं है प्रक्षेपण।
दस्तावेज़ों से उदाहरण उधार लेना जहां आप दोनों का उपयोग कर सकते हैं:
db.students.find(
// use $elemMatch query operator to match multiple criteria in the grades array
{ grades: {
$elemMatch: {
mean: { $gt: 70 },
grade: { $gt: 90 }
}
}},
// use $ projection to get the first matching item in the "grades" array
{ "grades.$": 1 }
)