2

アプリには Item と Comment の 2 つのモデルがあります。Item には多くのコメントを含めることができ、Comment インスタンスには、キー「comment」を持つ Item インスタンスへの参照が含まれており、関係を追跡できます。

ここで、特定の URL でユーザーが要求したときに、すべてのアイテムの JSON リストをコメント カウントとともに送信する必要があります。

function(req, res){
  return Item.find()
    .exec(function(err, items) {
        return res.send(items);
    });
};

アイテムにコメント数を「入力」する方法がわかりません。これは一般的な問題のようであり、私はこの仕事を力ずくで行うよりも優れた方法があるべきだと考える傾向があります。

だからあなたの考えを共有してください。コメント数をアイテムにどのように「入力」しますか?

4

2 に答える 2

0

この問題についていくつかの調査を行ったところ、次の結果が得られました。まず、MongoDB のドキュメントでは次のように提案されています。

一般に、次の場合に埋め込みデータ モデルを使用します。

  • エンティティ間に「含む」関係があります。
  • 「多」オブジェクトが常に親ドキュメントのコンテキストで表示されるか、そのコンテキストで表示される 1 対多の関係があります。

したがって、私の状況では、s が独立して存在するのではなく、sCommentに埋め込まれている方がはるかに理にかなっています。Item

それでも、データ モデルを変更せずに解決策を知りたいと思っていました。MongoDB docs で述べたように:

参照は埋め込みよりも柔軟性があります。ただし、参照を解決するには、クライアント側のアプリケーションがフォローアップ クエリを発行する必要があります。つまり、参照を使用すると、サーバーへのラウンドトリップがさらに必要になります。

現在、複数の往復がコーシャであるため、次の解決策を思いつきました。

var showList = function(req, res){

  // first DB roundtrip: fetch all items
  return Item.find()
        .exec(function(err, items) {
            // second DB roundtrip: fetch comment counts grouped by item ids
            Comment.aggregate({
                $group: {
                    _id: '$item',
                    count: {
                        $sum: 1
                    }
                }
            }, function(err, agg){
                // iterate over comment count groups (yes, that little dash is underscore.js)
                _.each(agg, function( itr ){
                    // for each aggregated group, search for corresponding item and put commentCount in it
                    var item = _.find(items, function( item ){
                        return item._id.toString() == itr._id.toString();
                    });
                    if ( item ) {
                        item.set('commentCount', itr.count);
                    }
                });
                // send items to the client in JSON format
                return res.send(items);
            })          
        });

};

同意?同意しませんか?あなたのコメントで私を啓発してください!

より良い回答がある場合は、ここに投稿してください。価値があると判断した場合は受け入れます。

于 2013-05-03T16:00:45.977 に答える