पीजी-वादे के साथ यह करना आसान है:
function buildTree(t) {
const v = q => t.any('SELECT id, value FROM votes WHERE question_id = $1', q.id)
.then(votes => {
q.votes = votes;
return q;
});
return t.map('SELECT * FROM questions', undefined, v).then(a => t.batch(a));
}
db.task(buildTree)
.then(data => {
console.log(data); // your data tree
})
.catch(error => {
console.log(error);
});
ऊपर जैसा ही है, लेकिन ES7 async
का उपयोग कर रहा है /await
वाक्य रचना:
await db.task(async t => {
const questions = await t.any('SELECT * FROM questions');
for(const q of questions) {
q.votes = await t.any('SELECT id, value FROM votes WHERE question_id = $1', [q.id]);
}
return questions;
});
// method "task" resolves with the correct data tree
एपीआई:नक्शा, कोई भी, कार्य, बैच
संबंधित प्रश्न:
- पीजी-वादे के साथ माता-पिता + बच्चों का पेड़ प्राप्त करें
- सशर्त कार्य स्नातकोत्तर-वादे के साथ
और यदि आप केवल एक क्वेरी का उपयोग करना चाहते हैं, तो PostgreSQL 9.4 और बाद के सिंटैक्स का उपयोग करके आप निम्न कार्य कर सकते हैं:
SELECT json_build_object('id', q.id, 'content', q.content, 'votes',
(SELECT json_agg(json_build_object('id', v.id, 'value', v.value))
FROM votes v WHERE q.id = v.question_id))
FROM questions q
और फिर आपका स्नातकोत्तर-वादा उदाहरण होगा:
const query =
`SELECT json_build_object('id', q.id, 'content', q.content, 'votes',
(SELECT json_agg(json_build_object('id', v.id, 'value', v.value))
FROM votes v WHERE q.id = v.question_id)) json
FROM questions q`;
const data = await db.map(query, [], a => a.json);
और आप निश्चित रूप से ऐसे जटिल प्रश्नों को बाहरी SQL फ़ाइलों में रखना चाहेंगे। क्वेरी फ़ाइलें देखें।
निष्कर्ष
ऊपर प्रस्तुत दो दृष्टिकोणों के बीच चुनाव आपके आवेदन की प्रदर्शन आवश्यकताओं पर आधारित होना चाहिए:
- एकल-क्वेरी दृष्टिकोण तेज़ है, लेकिन काफी क्रियात्मक होने के कारण इसे पढ़ना या विस्तारित करना कुछ कठिन है
- बहु-क्वेरी दृष्टिकोण को समझना और विस्तारित करना आसान है, लेकिन निष्पादित प्रश्नों की गतिशील संख्या के कारण यह प्रदर्शन के लिए बहुत अच्छा नहीं है।
अद्यतन-1
निम्नलिखित संबंधित उत्तर बाल प्रश्नों को संयोजित करके अधिक विकल्प प्रदान करता है, जो बहुत बेहतर प्रदर्शन देगा:नेस्टेड लूप क्वेरी को मूल परिणाम pg-वादा में संयोजित करें।
अद्यतन-2
एक और उदाहरण जोड़ा गया, ES7 async
. का उपयोग करते हुए /await
दृष्टिकोण।