【问题标题】:groups by name and provider, then group by month and then get the average of month wise in mongoose按名称和提供者分组,然后按月分组,然后在猫鼬中获得月份的平均值
【发布时间】:2021-09-24 23:31:24
【问题描述】:

我想按名称和提供者分组,然后按月分组,然后在猫鼬中获得每月的平均值 预期结果,按名称和月份划分的平均组。谢谢

我在 MongoDB 中的集合如下所示:

{
    "_id" : ObjectId("614d713c28af063f4cffbb6f"),
    "name" : "Chibi Doge",
    "id" : "0x7c8e01e8df38f001bcefb3b8901ad5d64374dbdf",
    "logo" : "https://img.rarible.com/prod/image/upload/t_avatar_big/prod-collections/0x7c8e01e8df38f001bcefb3b8901ad5d64374dbdf/avatar/Qmdp79f2nP8HRYwwQiEDuRcy6F9ysW4WPdG5QiSvpd57Hu",
    "provider" : "rarible",
    "totalSalesUsd" : 27436.1841495685,
    "totalNFTs" : 59,
    "createdAt" : ISODate("2021-09-24T06:33:32.708Z"),
    "updatedAt" : ISODate("2021-09-24T06:33:32.537Z"),
    "__v" : 0
}

/* 2 */
{
    "_id" : ObjectId("614d713d28af063f4cffbb73"),
    "name" : "",
    "id" : "0xa7206d878c5c3871826dfdb42191c49b1d11f466",
    "logo" : "https://img.rarible.com/prod/image/upload/t_avatar_big/prod-collections/0xa7206d878c5c3871826dfdb42191c49b1d11f466/avatar/QmYCxLp2puXnnarXHyTcY9onjMqrTAUNQskpirL5VPFF6B",
    "provider" : "rarible",
    "totalSalesUsd" : 26176.2678881893,
    "totalNFTs" : 7,
    "createdAt" : ISODate("2021-09-24T06:33:33.228Z"),
    "updatedAt" : ISODate("2021-09-24T06:33:33.057Z"),
    "__v" : 0
}

我写了一个查询,结果如下:

[
    {
        "_id": {
            "provider": "superrare",
            "name": "batsoupyum2"
        },
        "data": [
            {
                "provider": "superrare",
                "name": "batsoupyum2",
                "totalSalesUsd" : 26176.2678881893,
                "createdAt": "2021-09-24T06:23:32.802Z"
            },
            {
                "provider": "superrare",
                "name": "batsoupyum2",
                "totalSalesUsd" : 26176.2678881893,
                "createdAt": "2021-08-24T06:33:32.708Z"
            }
        ]
    }
    ]

查询是

collection.aggregate([
    {
      $group: {
        _id: {
          provider: "$provider",
          name: "$name",
          // month: { $month: "$createdAt" },
          // avgQuantity: { $avg: "$totalSalesUsd" }
        },
        data: {
        $push: {
          provider: "$provider",
             name: "$name",
             totalSalesUsd: "$totalSalesUsd",
             createdAt: "$createdAt"
            // average: "$_id.average"
          },
         },
      },
    },
])

如何使用 mongoose.js 框架做到这一点?

【问题讨论】:

  • 想要得到totalSalesUsd 的平均值。谢谢

标签: node.js mongodb mongoose


【解决方案1】:

您已经很接近了,您要做的是添加另一个$group 阶段,您需要从提供者和时间上的$grouping 开始,然后您才能再次对提供者进行分组,如下所示:

db.collection.aggregate([
  {
    $group: {
      _id: {
        provider: "$provider",
        name: "$name",
        month: {
          $month: "$createdAt"
        },
        year: {
          $year: "$createdAt"
        }
      },
      avgQuantity: {
        $avg: "$totalSalesUsd"
      }
    }
  },
  {
    $group: {
      _id: {
        provider: "$_id.provider",
        name: "$_id.name"
      },
      data: {
        $push: {
          provider: "$_id.provider",
          name: "$_id.name",
          avgQuantity: "$avgQuantity",
          month: "$_id.month",
          year: "$_id.year"
        }
      }
    }
  }
])

Mongo Playground

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-13
    • 1970-01-01
    • 2014-05-22
    • 2019-03-16
    • 2014-01-30
    • 1970-01-01
    相关资源
    最近更新 更多