मैं मोंगोडब में काफी नया हूं। मेरे पास संदेश नाम का एक संग्रह है जिसमें एक फ़ील्ड नाम usrId है। यह क्षेत्र किसी छात्र या व्यवस्थापक को संदर्भित कर सकता है। इसलिए मैं संदेश की 3 तालिकाओं में शामिल होता हूं और छात्र और चैटएडमिन यह पता लगाने के लिए कि यह संदेश किससे भेजा गया है।

लेकिन बात यह है कि, मुझे परिणाम फ़ील्ड में 2 अलग-अलग ऑब्जेक्ट नहीं चाहिए। मैं सिर्फ एक उपयोगकर्ता ऑब्जेक्ट रखना चाहता हूं जिसमें छात्र या व्यवस्थापक हो। संदेश केवल उनमें से एक से है।

संदेश संग्रह:

{
"_id" : ObjectId("5c73d1aec058ed1b1ce0acb4"),
"msg" : "test",
"usrId" : ObjectId("5c63f0f1dcebbc69fba10db5"),
"chId" : ObjectId("5c7121b794b7b935e41568b3"),
"pinned" : false,
"warned" : false,
"marked" : false
}

कोड मैंने कोशिश की है:

 con.collection("message").aggregate([
            {$match: {"chId": chId}},
            {
                $lookup: {
                    from: "student",
                    localField: "usrId",
                    foreignField: "_id",
                    as: "student"
                }
            },
            { $unwind: { path: "$student", preserveNullAndEmptyArrays: true } },

            {
                $lookup: {
                    from: "chatAdmin",
                    localField: "usrId",
                    foreignField: "_id",
                    as: "chAdmin"
                }
            },
            { $unwind: { path: "$chAdmin", preserveNullAndEmptyArrays: true } },

        ])

मुझे जो परिणाम चाहिए वह है:

{
"_id" : ObjectId("5c73d1aec058ed1b1ce0acb4"),
"msg" : "test",
"usrId" : ObjectId("5c63f0f1dcebbc69fba10db5"),
"chId" : ObjectId("5c7121b794b7b935e41568b3"),
"pinned" : false,
"warned" : false,
"marked" : false,
"user"{ "role":"student" , image :"" , "name":"test"}
}

या यदि प्रेषक व्यवस्थापक है:

{
"_id" : ObjectId("5c73d1aec058ed1b1ce0acb4"),
"msg" : "test",
"usrId" : ObjectId("5c63f0f1dcebbc69fba10db5"),
"chId" : ObjectId("5c7121b794b7b935e41568b3"),
"pinned" : false,
"warned" : false,
"marked" : false,
"user"{ "role":"admin" , image :"" , "name":"test"}
}
0
Shahrzad Nazemi 25 फरवरी 2019, 15:45

1 उत्तर

सबसे बढ़िया उत्तर

आपको अपने डिजाइन पर विचार करना चाहिए। MongoDB एक रिलेशनल डेटाबेस नहीं है, इसलिए आपके पास टेबल नहीं हैं, और आप आमतौर पर मुख्य पैटर्न के रूप में जुड़ने से बचना चाहेंगे, खासकर जब आपके पास बड़ा डेटा हो।

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

कहा जा सकता है, सीखने के लिए, आप ऐसा कुछ कर सकते हैं:

$addFields: {
    user: {
        $cond: [
            {$ifNull: ['$student', false]},
            {role: 'admin', image: $chAdmin.image, name: $chAdmin.name},
            {role: 'student', image: $student.image, name: $student.name}
        ]
    }
}
1
TechWisdom 25 फरवरी 2019, 13:41