私はnodejsとLoopback/Expressを初めて使用しています。私は関連するモデルの複数のdb要求を持つAPI呼び出しを含む簡単なアプリケーションを作成しようとしていますが、これを示す関連ドキュメントや例は見つかりません。リモートメソッドの関連モデルの複数のクエリ
著者、投稿、評価の3つのモデルを想像してみてください。各投稿にhasOne AuthorとhasMany Ratingsがあります。 Ratingsには「星」と呼ばれる整数値があります。 (関連Authorモデルに格納されている)
- 投稿詳細
- 著者の詳細
- :
私は、次のすべてを返す必要があります「詳細」と呼ばれる記事のカスタムAPIのremoteMethodを作成しています関連する評価の関連評価持つ星の関連評価持つ星の数は== 1
- 数は== 2
- 数持つ星== 3
これを実装する最善の方法は、最も少ない並列クエリ数を持つクエリですか?私は約束を使用して次のコードを試しましたが、本質的にそれはデータベースへの複数の不要なクエリを作成する非効率的な同期コードであり、すぐに非常に乱雑になります。
Post.details = function(id, cb) {
var LoopBackContext = require('loopback-context');
var app = require('../../server/server');
var Author = app.models.Author;
var Rating = app.models.Rating;
var response = {post: null,
author: null,
ratings_0: null,
ratings_1: null,
ratings_2: null
};
Post.findById(id, {include: 'author', where: {deleted: false}})
.then(function(p) {
response.post = p;
return Author.findById(p.authorId);
})
.then(function(r) {
response.author = r;
return Rating.find({where: {postId: id, stars: 0}});
})
.then(function(r) {
response.votes_0 = r.length;
return Rating.find({where: {postId: id, stars: 1}});
})
.then(function(r) {
response.votes_1 = r.length;
return Rating.find({where: {postId: id, stars: 2}});
})
.then(function(r) {
response.votes_2 = r.length;
cb(null, response);
});
};
これはあまりにも些細なことにはあまりにも多すぎます。また、クエリに 'include'を使用しようとしましたが、使用するのが難しくなり、ループバックでレベル2フィルタをサポートしません。
これを実装するにはどうすればよいですか?
少しリファクタリングと変更とまあ
このすべてのリクエストは、Promise.allと並行して実行できます –