mongodb - 如何执行这个 mongo 聚合?
问题描述
我在 mongo 中有一个如下所示的集合:
{
"_id" : ObjectId("5c98d6f383d67f243730443b"),
"date" : ISODate("2019-03-24T00:00:00Z"),
"symbol" : "F:ABCD",
"symbolCode" : "wcgahi8gap",
"close" : 8.09,
"high" : 24.82,
"low" : 8.09,
"numPoints" : 8,
"open" : 20.84,
"volume" : 21183
}
{
"_id" : ObjectId("5c98d6f383d67f243730443c"),
"date" : ISODate("2019-03-25T00:00:00Z"),
"symbol" : "F:ABCD",
"symbolCode" : "wcgahi8gap",
"close" : 1.77,
"high" : 23.47,
"low" : 1.77,
"numPoints" : 3,
"open" : 8.21,
"volume" : 9645
}
它显示了一天结束时的股票价格。我正在尝试编写一个聚合来计算每只股票在 1 天间隔内的变化/百分比变化。所以它应该只是当天收盘字段和前一天收盘字段之间的差异。我怎样才能做到这一点?
这是我到目前为止所拥有的:
const results = await Price.aggregate([
{ $match: { date: { $gte: yesterday } } },
{ $sort: { date: 1 } },
{ $group: { '_id': '$_id',
'old': {
$sum: { $cond: [{ '$eq': [ '$date', yesterday ] }, '$close', 0] }
},
'new': {
$sum: { $cond: [{ '$eq': [ '$date', today ] }, '$close', 0] }
} } },
{ $project: { date: 1, symbol: 1, difference: { $subtract: ['$new', '$old'] } } }
])
我知道我错过了小组赛的一个重要部分,但我想不通。
解决方案
所以我是这样做的:
const results = await Price.aggregate([
{ $match: { date: { $gte: yesterday } } },
{ $sort: { date: 1 } },
{ $group: { '_id': '$symbol',
old: {
$sum: {
$cond: [{ $eq: ['$date', yesterday] }, '$close', 0]
}
},
new: {
$sum: {
$cond: [{ $eq: ['$date', today] }, '$close', 0]
}
} } },
{ $project: {
symbol: '$_id',
change: { $subtract: ['$new', '$old'] },
changePrc: { $divide: [{ $subtract: ['$new', '$old'] }, '$old'] }
} }
])
使用此答案寻求帮助。
推荐阅读
- powerpivot - 具有来自多个表的组合度量的 Power Pivot
- .net - ILMerge / ILRepack dll 无法使用 Dynamics 365 插件注册工具注册
- node.js - Sinon mock 正在调用真正的 AWS Secrets Manager
- python - 为什么一个类可以调用另一个类的魔法方法?
- google-my-business - 如何解决“Google 我的商家”位置重复问题?
- sql - 根据第一次查询的结果将列添加到 SQL 结果
- python - Unicode 转义 Python
- c# - Windows Application Packaging Project
- javascript - Discord.js command handler bot doesn't respond
- javascript - Can someone explain to me why one function works and the other don't?