मैं एक प्रश्न-उत्तर डेटाबेस बना रहा हूं। मेरे पास तीन स्कीमा हैं, उपयोगकर्ता, प्रश्न और उत्तर (उत्तर)। मेरी समस्या वहां से शुरू होती है जहां मैं केवल उन प्रश्नों को पूछना चाहता हूं जिनका उपयोगकर्ता ने पहले ही उत्तर नहीं दिया है। लेकिन जब मैं इस क्वेरी को चलाता हूं तो मुझे एक खाली उत्तर सरणी के साथ प्रश्न मिलता है। क्या मुझे इसे किसी भी तरह से पॉप्युलेट करना चाहिए? यहाँ मुझे मिला है:

जिज्ञासा:

let getQuestions = (req, res)=>{

    Question.aggregate([
        {
            $match: {isGlobal: true}
        },
        {
            $lookup: {
                from: 'Reply',
                localField: '_id',
                foreignField: 'questionID',
                as: 'replies'
            }
        },
        // {
        //     $match: {}
        // }
    ]).then(foundQuestions=> console.log(foundQuestions))
};

उपयोगकर्ता स्कीमा (सरलीकृत):

const mongoose = require('mongoose');

const userSchema = mongoose.Schema({
    firstName: String,
    lastName: String,
    email: String,
    questionReplies: [
        {
            type: mongoose.Schema.Types.ObjectId,
            ref: 'Reply'
        }
    ],
}, {timestamps: true});

module.exports = mongoose.model('User', userSchema);

प्रश्न स्कीमा:

const mongoose = require('mongoose');

const questionSchema = mongoose.Schema({
    title: String,
    description: String,
    isGlobal: Boolean,
    options: [
        {
            number: Number,
            title: String,
        }
    ]
}, {timestamps: true});

module.exports = mongoose.model('Question', questionSchema);

उत्तर स्कीमा:

const mongoose = require('mongoose');

const replySchema = mongoose.Schema({
    questionID: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'Question',
        required: true
    },
    email: {type: String, required: true},
    answerID: {type: String, required: true},
    number: Number,
    title: String,
}, {timestamps: true});

module.exports = mongoose.model('Reply', replySchema);

मेरे उत्तर संग्रह में यह दस्तावेज़ अंदर है:

"questionID" : ObjectId("5c6f6867cbff9c2a9004eb6d")

और मेरे पास इस आईडी के साथ एक प्रश्न है:

"_id" : ObjectId("5c6f6867cbff9c2a9004eb6d"),

(डेटाबेस डिजाइन में सुधार पर किसी भी विकल्प का भी स्वागत है)।

0
Arootin Aghazaryan 22 फरवरी 2019, 16:05

2 जवाब

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

मैंने अपनी समस्या हल कर ली है और मैं भविष्य के संदर्भों के लिए यहां पोस्ट करता हूं।

from में इस्तेमाल किया गया $lookup फ़ील्ड मोंगोडब द्वारा बनाए गए संग्रह नाम को संदर्भित करता है, न कि नेवला में प्रयुक्त मॉडल का नाम। तो सही क्वेरी है:

$lookup: {
    from: 'replies',
    localField: '_id',
    foreignField: 'questionID',
    as: 'replies'
}

और फिर मैंने जोड़ा

{
    $match: { "replies": { $eq: [] } }
}

बिना किसी उत्तर के सिर्फ प्रश्न खोजने के लिए।

0
Arootin Aghazaryan 25 फरवरी 2019, 05:54

नीचे प्रयास करें:

let getQuestions = (req, res)=>{
    Question.aggregate([
        {
            $match: {isGlobal: true}
        },
        {
            $lookup: {
                from: 'Reply',
                localField: '_id',
                foreignField: 'questionID',
                as: 'replies'
            }
        },
        {
             $match: { "replies": { $eq: [] } }
        }
    ]).then(foundQuestions=> console.log(foundQuestions))
};

तो आपको ऐसे प्रश्न मिलेंगे जिनका कोई उत्तर नहीं है।

0
Jitendra 22 फरवरी 2019, 16:40