MongoDB: कैसे पता लगाना है कि किसी सरणी फ़ील्ड में कोई तत्व है या नहीं?



(2)

मेरे पास दो संग्रह हैं। पहले संग्रह में छात्रों को शामिल किया गया है:

{ "_id" : ObjectId("51780f796ec4051a536015cf"), "name" : "John" }
{ "_id" : ObjectId("51780f796ec4051a536015d0"), "name" : "Sam" }
{ "_id" : ObjectId("51780f796ec4051a536015d1"), "name" : "Chris" }
{ "_id" : ObjectId("51780f796ec4051a536015d2"), "name" : "Joe" }

दूसरे संग्रह में पाठ्यक्रम शामिल हैं:

{
        "_id" : ObjectId("51780fb5c9c41825e3e21fc4"),
        "name" : "CS 101",
        "students" : [
                ObjectId("51780f796ec4051a536015cf"),
                ObjectId("51780f796ec4051a536015d0"),
                ObjectId("51780f796ec4051a536015d2")
        ]
}
{
        "_id" : ObjectId("51780fb5c9c41825e3e21fc5"),
        "name" : "Literature",
        "students" : [
                ObjectId("51780f796ec4051a536015d0"),
                ObjectId("51780f796ec4051a536015d0"),
                ObjectId("51780f796ec4051a536015d2")
        ]
}
{
        "_id" : ObjectId("51780fb5c9c41825e3e21fc6"),
        "name" : "Physics",
        "students" : [
                ObjectId("51780f796ec4051a536015cf"),
                ObjectId("51780f796ec4051a536015d0")
        ]
}

प्रत्येक पाठ्यक्रम दस्तावेज़ में students सरणी होती है जिसमें पाठ्यक्रम के लिए पंजीकृत छात्रों की एक सूची होती है। जब कोई छात्र किसी वेब पेज पर पाठ्यक्रम देखता है तो उसे यह देखने की ज़रूरत होती है कि क्या वह पहले से ही पाठ्यक्रम के लिए पंजीकृत है या नहीं। ऐसा करने के लिए, जब courses संग्रह छात्र की ओर से पूछताछ की जाती है, तो हमें यह पता लगाना होगा कि क्या students सरणी में पहले से ही छात्र का ऑब्जेक्ट आईडी है। छात्र ObjectId को केवल students सरणी से पुनर्प्राप्त करने के लिए एक खोज क्वेरी के प्रक्षेपण में निर्दिष्ट करने का कोई तरीका है यदि यह वहां है?

मैंने यह देखने की कोशिश की कि क्या मैं $ elemMatch ऑपरेटर कर सकता हूं लेकिन यह उप-दस्तावेजों की एक सरणी के लिए तैयार है। मैं समझता हूं कि मैं एकत्रीकरण ढांचे का उपयोग कर सकता हूं लेकिन ऐसा लगता है कि इस मामले में यह अधिक होगा। एकत्रीकरण ढांचा शायद एक ही खोज क्वेरी के रूप में तेज़ नहीं होगा। पाठ्यक्रम संग्रह को क्वेरी करने का कोई तरीका है ताकि लौटाया गया दस्तावेज़ इस तरह के रूप में हो सकता है?

{
        "_id" : ObjectId("51780fb5c9c41825e3e21fc4"),
        "name" : "CS 101",
        "students" : [
                ObjectId("51780f796ec4051a536015d0"),
        ]
}

[हाल के संस्करणों में अब इस पर आधारित है]

[अपडेटेड उत्तर] आप कक्षा के नाम और छात्र आईडी को वापस पाने के लिए निम्न तरीके से पूछ सकते हैं यदि वे पहले ही नामांकित हैं।

db.student.find({},
 {_id:0, name:1, students:{$elemMatch:{$eq:ObjectId("51780f796ec4051a536015cf")}}})

और आप जो उम्मीद करेंगे वह वापस आ जाएगा:

{ "name" : "CS 101", "students" : [ ObjectId("51780f796ec4051a536015cf") ] }
{ "name" : "Literature" }
{ "name" : "Physics", "students" : [ ObjectId("51780f796ec4051a536015cf") ] }

[मूल उत्तर] वर्तमान में आप जो करना चाहते हैं वह करना संभव नहीं है। यह दुर्भाग्यपूर्ण है क्योंकि यदि आप किसी ऑब्जेक्ट के रूप में सरणी में संग्रहीत किया गया था तो आप ऐसा करने में सक्षम होंगे। असल में, मैं थोड़ा आश्चर्यचकित हूं कि आप ऑब्जेक्टआईडी () का उपयोग कर रहे हैं क्योंकि आपको हमेशा छात्रों को देखने की आवश्यकता होगी यदि आप किसी विशेष पाठ्यक्रम में नामांकित छात्रों की एक सूची प्रदर्शित करना चाहते हैं (आईडी की पहली सूची देखें छात्रों के संग्रह में नाम - एक के बजाय दो प्रश्न!)

यदि आप इस तरह के पाठ्यक्रम सरणी में एक आईडी और नाम संग्रहित कर रहे थे (उदाहरण के रूप में):

{
        "_id" : ObjectId("51780fb5c9c41825e3e21fc6"),
        "name" : "Physics",
        "students" : [
                {id: ObjectId("51780f796ec4051a536015cf"), name: "John"},
                {id: ObjectId("51780f796ec4051a536015d0"), name: "Sam"}
        ]
}

तब आपकी क्वेरी बस होगी:

db.course.find( { }, 
                { students : 
                    { $elemMatch : 
                       { id : ObjectId("51780f796ec4051a536015d0"), 
                         name : "Sam" 
                       } 
                    } 
                } 
);

यदि वह छात्र केवल सीएस 101 में दाखिला लिया गया था तो आप वापस आ जाएंगे:

{ "name" : "Literature" }
{ "name" : "Physics" }
{
    "name" : "CS 101",
    "students" : [
        {
            "id" : ObjectId("51780f796ec4051a536015cf"),
            "name" : "John"
        }
    ]
}

ऐसा लगता है कि ऑपरेटर $in आपके उद्देश्यों को ठीक से पूरा करेगा।

आप ऐसा कुछ कर सकते हैं (छद्म-क्वेरी):

if (db.courses.find({"students" : {"$in" : [studentId]}, "course" : courseId }).count() > 0) {
  // student is enrolled in class
}

वैकल्पिक रूप से, आप "course" : courseId को हटा सकते हैं "course" : courseId क्लॉज और छात्र द्वारा नामांकित सभी कक्षाओं का एक सेट वापस प्राप्त करें।





mongodb