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 而不是按字符串分组。

Mongo Playground