私は mongoDB を初めて使用し、集約パイプラインについて理解するのに苦労しています。
株式取引に関する情報を保持するデータベースを作成しました。私のポートフォリオ コレクションの 1 つのドキュメントを簡略化したバージョンでは、次のようになります。
{
"date" : 2015-12-31T15:50:00.000Z,
"time" : 1550,
"aum" : 1000000,
"basket" :[
{
"_id" : "Microsoft",
"shares" : 10,
"price" : 56.53,
"fx" : 1.0
},
.
.
.
{
"_id" : "GOOG.N",
"shares" : 20,
"price" : 759.69,
"fx" : 1.0
}
]
そのため、毎日、運用資産 (オウム) と現在の価格で保持しているすべてのポジションのリストを追跡しています。私がしなければならないことは、ポートフォリオの毎日の純および総エクスポージャーをオウムのパーセンテージとして計算することです。ネットエクスポージャーは単純に次のとおりです。
sum(shares*price*fx)/aum
すべての株の上。総エクスポージャーは次のとおりです。
abs(shares*price*fx)/aum
(負のポジションはショート ポジションを意味します)。集計フレームワークを使用して、これを単一のクエリとして実行する必要があります。私は多くのクエリを試しましたが、どれもうまくいかないようで、暗闇の中をさまよっているだけです. 誰でもガイダンスを提供できますか?
私のクエリは次のようになります
db.strategy.aggregate(
// Pipeline
[
// Stage 1
{
$project: {
"_id": 0,
"date":1,
"time":1,
"aum":1,
"strategyName":1,
"gExposure": {$divide: ["$grossExposure","$aum"]}
}
},
// Stage 2
{
$group: {
_id :{ date:"$date",time:"$time",strategyName:"$strategyName"},
grossExposure: { $sum: { $abs: {$multiply: [ "$basket.sysCurShares","$basket.price","$basket.fx" ] } }}
}
},
// Stage 3
{
$sort: {
"_id.date": 1, "_id.time": 1, "_id.strategyName": 1
}
}
]
);
クエリは実行されますが、計算された値はゼロです。すべてのデータを 2 次元のテーブルにフラット化する必要があるため、投影が期待どおりに機能しません。