我是 mongoDB 的新手,很难理解聚合管道。
我创建了一个数据库,其中包含有关我的股票交易的信息。在精简版中,我的投资组合集合中的一个文档看起来有点像这样
{
"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
}
]
因此,对于每一天,我都会跟踪我管理的资产 (aum) 以及我以当前价格持有的所有头寸的清单。我需要做的是计算投资组合的每日净敞口和总敞口占 aum 的百分比。净曝光率很简单:
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
}
}
]
);
查询运行,但计算的值为零。我的投影也没有像我预期的那样工作,因为我希望将所有数据展平为二维表。