首頁 > 資料庫 > mysql教程 > 如何使用 NodeJS 在 PostgreSQL 中以單一 JSON 物件的形式高效檢索問題及其相關投票?

如何使用 NodeJS 在 PostgreSQL 中以單一 JSON 物件的形式高效檢索問題及其相關投票?

Mary-Kate Olsen
發布: 2025-01-11 07:11:42
原創
823 人瀏覽過

How to Efficiently Retrieve Questions and Their Associated Votes as a Single JSON Object in PostgreSQL with NodeJS?

在 PostgreSQL 和 NodeJS 中擷取問題和投票

本文探討了使用 PostgreSQL 和 NodeJS 將問題及其相關投票作為單一 JSON 物件取得的有效方法。 我們將研究幾種方法,權衡它們的性能影響。

應用程式場景涉及使用者提問和投票(贊成或反對)。目標是檢索每個問題及其投票數組。

方法一:多次查詢(pg-promise)

此方法使用 pg-promise 執行多個查詢。 首先,它檢索所有問題。然後,對於每個問題,它都會獲得相應的投票。

<code class="language-javascript">function buildTree(t) {
    const v = q =>
        t
            .any('SELECT id, value FROM votes WHERE question_id = ', 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); 
    })
    .catch((error) => {
        console.log(error);
    });</code>
登入後複製

或者,用 ES7 async/await

<code class="language-javascript">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 = ', [q.id]);
    }
    return questions;
});</code>
登入後複製

方法二:單次查詢(PostgreSQL JSON 函數)

PostgreSQL 9.4 及更高版本提供了使用 JSON 函數的更有效率的單查詢解決方案:

<code class="language-sql">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;</code>
登入後複製

此查詢為每個問題建構一個 JSON 對象,包括投票的聚合數組。 與pg-promise

<code class="language-javascript">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);</code>
登入後複製

效能比較

由於減少了資料庫往返次數,單一查詢方法(方法 2)明顯更快。 然而,方法1(多次查詢)提供了更好的可讀性和可維護性,特別是對於更複雜的場景。

為了在大型資料集上獲得最佳效能,請考慮連接子查詢等技術以最大限度地減少資料庫交互,如有關組合嵌套循環查詢的相關資源中所述。

以上是如何使用 NodeJS 在 PostgreSQL 中以單一 JSON 物件的形式高效檢索問題及其相關投票?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板