Вложенный запрос из postgresql и pg-promise - PullRequest
0 голосов
/ 04 октября 2018

Я пытаюсь получить вложенный запрос из postgres в узле с pg-обещанием.

Мне удалось получить только простой не вложенный результат со смешанными данными из таблиц.

Я хочу получитьиз трех таблиц (пользователи, сообщения, комментарии) по одному набору данных для каждого сообщения - users.username, posts.text, post.timestamp, comments.author, comments.text, comments.timestamp.Пользователи и сообщения связаны с именем пользователя, сообщения и комментарии связаны с posts.id и comments.parrent.

Это данные, которые я хочу получить:

[
 {"username": "jane", 
 "postText": "Hello", 
  "postId": 4,
  "postTimestamp: "1651156414", 
  allComments: [
       {"commentsId": 2,
        "commentsAuthor": "john", 
        "commentsText": "nice", 
        "commentsTimestamp": "156454565456"
        }, 
       {"commentsId": 3,
        "commentsAuthor": "ghost",
       "commentsText": "hiii", 
       "commentsTimestamp": "165165848"}]
   }]

Я делаю это сpg-обещание:

function getUsers(t) {
    return t.map('SELECT * FROM posts', post=> {
        return t.map('SELECT * FROM users WHERE users.username = post.username', post.id, user => {
        return t.any('SELECT * FROM comments, posts WHERE comments.parrent = post.id', user.id)
        .then(comment => {
              user.comment = comment;
                return user;
                });
        })
            .then(t.batch) 
            .then(user=> {
              post.user = user;
                return post;
            });
    }).then(t.batch); 
}

db.task(getUsers)
    .then(data => {
      console.log(data)
        res.send(data)
    })
    .catch(error => {
      console.log(error)
    });

});

Это дает мне ошибку:

  TypeError: undefined is not a function at Array.map (<anonymous>) at obj.any.call.then.data

У вас есть, пожалуйста, какие-либо идеи, что я делаю не так?Спасибо

1 Ответ

0 голосов
/ 04 октября 2018

Проблема в этой строке:

return t.map('SELECT * FROM posts', post => {

, которая должна быть:

return t.map('SELECT * FROM posts', [], post => {

Вы передаете функцию в качестве параметра форматирования, следовательно, проблема.

Но, как правило, этот пост дает гораздо более высокое решение с точки зрения производительности с помощью функции JSON json_build_object, поскольку вы будете выполнять только один запрос против многих, которые вы пытаетесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...