मैं एक प्रश्न-उत्तर डेटाबेस बना रहा हूं। मेरे पास तीन स्कीमा हैं, उपयोगकर्ता, प्रश्न और उत्तर (उत्तर)। मेरी समस्या वहां से शुरू होती है जहां मैं केवल उन प्रश्नों को पूछना चाहता हूं जिनका उपयोगकर्ता ने पहले ही उत्तर नहीं दिया है। लेकिन जब मैं इस क्वेरी को चलाता हूं तो मुझे एक खाली उत्तर सरणी के साथ प्रश्न मिलता है। क्या मुझे इसे किसी भी तरह से पॉप्युलेट करना चाहिए? यहाँ मुझे मिला है:
जिज्ञासा:
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"),
(डेटाबेस डिजाइन में सुधार पर किसी भी विकल्प का भी स्वागत है)।
2 जवाब
मैंने अपनी समस्या हल कर ली है और मैं भविष्य के संदर्भों के लिए यहां पोस्ट करता हूं।
from
में इस्तेमाल किया गया $lookup
फ़ील्ड मोंगोडब द्वारा बनाए गए संग्रह नाम को संदर्भित करता है, न कि नेवला में प्रयुक्त मॉडल का नाम। तो सही क्वेरी है:
$lookup: {
from: 'replies',
localField: '_id',
foreignField: 'questionID',
as: 'replies'
}
और फिर मैंने जोड़ा
{
$match: { "replies": { $eq: [] } }
}
बिना किसी उत्तर के सिर्फ प्रश्न खोजने के लिए।
नीचे प्रयास करें:
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))
};
तो आपको ऐसे प्रश्न मिलेंगे जिनका कोई उत्तर नहीं है।