この問題についていくつかの調査を行ったところ、次の結果が得られました。まず、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);
})
});
};
同意?同意しませんか?あなたのコメントで私を啓発してください!
より良い回答がある場合は、ここに投稿してください。価値があると判断した場合は受け入れます。