MongoDB:将每小时数据汇总为每日汇总
MongoDB: Aggregating hourly data into daily aggregates
我是 MongoDB 的新手,无法找到解决问题的方法。
我正在收集每小时的加密数据。每个文档都是一个对象数组。在这些对象中的每一个中,都有另一个嵌套的对象数组。看起来如下:
timestamp: "2022-05-11T12:38:01.537Z",
positions: [
{
detail: 1,
name: "name",
importantNumber: 0,
arrayOfTokens: [
{
tokenName: "name",
tokenSymbol: "symbol",
tokenPrice: 1,
tokensEarned: 10,
baseAssetValueOfTokensEarned: 10,
},
{
tokenName: "name2",
tokenSymbol: "symbol2",
tokenPrice: 2,
tokensEarned: 10,
baseAssetValueOfTokensEarned: 20,
},
],
},
],};
我的目标是能够将每小时的数据聚合到每天的组中,其中时间戳成为当天的日期,位置数组仍然包含每个位置的主要详细信息,对 importantNumber 求和(我相信我已经能够实现),并将每个代币的每个小时的代币详情聚合到一个对象中,计算代币平均价格,总代币赚取等
我目前拥有的是:
const res = await Name.aggregate([
{
$unwind: {
path: "$positions",
},
},
{
$project: {
_id: 0,
timestamp: "$timestamp",
detail: "$positions.detail",
name: "$positions.name",
importantNumber: "$positions.importantNumber",
arrayOfTokens: "$positions.arrayOfTokens ",
},
},
{
$group: {
_id: {
date: { $dateToString: { format: "%Y-%m-%d", date: "$timestamp" } },
name: "$name",
},
importantNumber: { $sum: "$importantNumber" },
arrayOfTokens: { $push: "$arrayOfTokens" }, // it is here that I am stuck
},
},
]);
return res;
};
记录了两个小时,上述查询 returns 以下结果,arrayOfTokens 包含多个数组:
{
_id: {
date: '2022-05-11',
name: 'name',
},
importantNumber: //sum of important number,
arrayOfTokens: [
[ [Object], [Object] ], // hour 1: token1, token2.
[ [Object], [Object] ] // hour 2: token1, token2
]
}
我希望 arrayOfTokens 只包含每个令牌对象的一个实例。类似于以下内容:
...
arrayOfTokens: [
{allToken1}, {allToken2} // with the name and symbol preserved, and average of the token price, sum of tokens earned and sum of base asset value.
]
非常感谢任何帮助,谢谢。
应该是这个:
db.collection.aggregate([
{ $unwind: { path: "$positions" } },
{
$group: {
_id: {
date: { $dateTrunc: { date: "$timestamp", unit: "day" } },
name: "$positions.name"
},
importantNumber: { $sum: "$positions.importantNumber" },
arrayOfTokens: { $push: "$positions.arrayOfTokens" }
}
}
])
我更喜欢 $dateTrunc
而不是按字符串分组。
我是 MongoDB 的新手,无法找到解决问题的方法。
我正在收集每小时的加密数据。每个文档都是一个对象数组。在这些对象中的每一个中,都有另一个嵌套的对象数组。看起来如下:
timestamp: "2022-05-11T12:38:01.537Z",
positions: [
{
detail: 1,
name: "name",
importantNumber: 0,
arrayOfTokens: [
{
tokenName: "name",
tokenSymbol: "symbol",
tokenPrice: 1,
tokensEarned: 10,
baseAssetValueOfTokensEarned: 10,
},
{
tokenName: "name2",
tokenSymbol: "symbol2",
tokenPrice: 2,
tokensEarned: 10,
baseAssetValueOfTokensEarned: 20,
},
],
},
],};
我的目标是能够将每小时的数据聚合到每天的组中,其中时间戳成为当天的日期,位置数组仍然包含每个位置的主要详细信息,对 importantNumber 求和(我相信我已经能够实现),并将每个代币的每个小时的代币详情聚合到一个对象中,计算代币平均价格,总代币赚取等
我目前拥有的是:
const res = await Name.aggregate([
{
$unwind: {
path: "$positions",
},
},
{
$project: {
_id: 0,
timestamp: "$timestamp",
detail: "$positions.detail",
name: "$positions.name",
importantNumber: "$positions.importantNumber",
arrayOfTokens: "$positions.arrayOfTokens ",
},
},
{
$group: {
_id: {
date: { $dateToString: { format: "%Y-%m-%d", date: "$timestamp" } },
name: "$name",
},
importantNumber: { $sum: "$importantNumber" },
arrayOfTokens: { $push: "$arrayOfTokens" }, // it is here that I am stuck
},
},
]);
return res;
};
记录了两个小时,上述查询 returns 以下结果,arrayOfTokens 包含多个数组:
{
_id: {
date: '2022-05-11',
name: 'name',
},
importantNumber: //sum of important number,
arrayOfTokens: [
[ [Object], [Object] ], // hour 1: token1, token2.
[ [Object], [Object] ] // hour 2: token1, token2
]
}
我希望 arrayOfTokens 只包含每个令牌对象的一个实例。类似于以下内容:
...
arrayOfTokens: [
{allToken1}, {allToken2} // with the name and symbol preserved, and average of the token price, sum of tokens earned and sum of base asset value.
]
非常感谢任何帮助,谢谢。
应该是这个:
db.collection.aggregate([
{ $unwind: { path: "$positions" } },
{
$group: {
_id: {
date: { $dateTrunc: { date: "$timestamp", unit: "day" } },
name: "$positions.name"
},
importantNumber: { $sum: "$positions.importantNumber" },
arrayOfTokens: { $push: "$positions.arrayOfTokens" }
}
}
])
我更喜欢 $dateTrunc
而不是按字符串分组。