यदि संभव हो, तो मेरा सुझाव है कि आप डेटा संग्रहीत करते समय शर्त सेट करें ताकि आप एक त्वरित सत्य जांच कर सकें (isInStudentsList
) उस प्रकार की क्वेरी करना बहुत तेज़ होगा।
अन्यथा, एक क्वेरी में आप जो चाहते हैं उसे करने के लिए एग्रीगेशन फ्रेमवर्क पाइपलाइन का उपयोग करने का एक अपेक्षाकृत जटिल तरीका है:
db.students.aggregate(
{$project:
{studentId: 1, studentIdComp: "$students.id"}},
{$unwind: "$studentIdComp"},
{$project : { studentId : 1,
isStudentEqual: { $eq : [ "$studentId", "$studentIdComp" ] }}},
{$match: {isStudentEqual: true}})
आपके इनपुट उदाहरण को देखते हुए आउटपुट होगा:
{
"result" : [
{
"_id" : ObjectId("517b88decd483543a8bdd95b"),
"studentId" : 23,
"isStudentEqual" : true
}
],
"ok" : 1
}
चरणों का संक्षिप्त विवरण:
- दस्तावेज़ का केवल
studentId
के साथ एक प्रोजेक्शन बनाएं और केवलid
. वाली सरणी के साथ एक नया फ़ील्ड (इसलिए पहला दस्तावेज़ इसमें होगा[23, 55]
। - उस संरचना का उपयोग करते हुए, $unwind
. यह
studentIdComp
. में प्रत्येक सरणी तत्व के लिए एक नया अस्थायी दस्तावेज़ बनाता है सरणी। - अब, उन दस्तावेज़ों को लें, और एक नया दस्तावेज़ प्रोजेक्शन बनाएं, जिसमें
studentId
बना रहे औरisStudentEqual
. नामक एक नया फ़ील्ड जोड़ता है जो दो क्षेत्रों की समानता की तुलना करता है,studentId
औरstudentIdComp
. याद रखें कि इस समय एक ही अस्थायी दस्तावेज़ है जिसमें वे दो फ़ील्ड शामिल हैं। - अंत में, जांचें कि तुलना मान
isStudentEqual
. है सत्य है और उन दस्तावेज़ों को वापस कर दें (जिसमें मूल दस्तावेज़ शामिल होगा_id
औरstudentId
. - यदि छात्र कई बार सूची में था, तो आपको परिणामों को
studentId
पर समूहीकृत करने की आवश्यकता हो सकती है या_id
डुप्लिकेट को रोकने के लिए (लेकिन मुझे नहीं पता कि आपको इसकी आवश्यकता होगी)।