【问题标题】:$group by each unique string in MongoDb aggreagte$group 按 MongoDb 聚合中的每个唯一字符串
【发布时间】:2020-06-13 23:21:33
【问题描述】:

我在 MongoDB 中有大量事件文档,我想按 createdAt 进行分组,并为同一天创建的事件计算每个唯一的 title

事件文档是这样的:

{
   "createdAt": 2020-02-03T00:00:00.000Z,
   "title": "Book meeting"
}

到目前为止,我得到了输出:

[{
        "titles": [
          "Book meeting",
          "Book meeting",
          "Personal meeting",
          "Personal meeting",
          "Book meeting",
          "Book meeting",
          "Book meeting",
          "Book meeting",
          "Training",
          "Book meeting",
          "Book meeting",
          "Book meeting",
          "Book meeting",
          "Book meeting",
          "Book meeting",
          "Book meeting",
          "Digital meeting",
          "Support"
        ],
        "date": "2020-02-03T00:00:00.000Z"
}, ...events ],

但我希望它是:

{
        "Book meeting": 10,
        "Digital meeting": 7,
        ...for all titles
        "date": "2020-02-03T00:00:00.000Z"
},

这是我目前正在做的事情:

    Events.aggregate().group({
        _id: {
          createdAt: "$createdAt",
          title: "$title"
        }
      })
      .group({
        _id: {
          year: { $year: "$_id.createdAt" },
          month: { $month: "$_id.createdAt" },
          day: { $dayOfMonth: "$_id.createdAt" }
        },
        titles: { $push: "$_id.title" }
      })
      .project({
        _id: 0,
        date: {
          $dateToString: {
            date: {
              $dateFromParts: {
                year: "$_id.year",
                month: "$_id.month",
                day: "$_id.day"
              }
            }
          }
        },
        titles: 1,
      })

【问题讨论】:

  • 你可以在问题中添加json格式的示例文档吗?
  • 它由createdAttitle组成。就是这样。
  • 你最好添加到问题中,它会帮助你得到答案。
  • 已将其添加到问题中!
  • 是createdAt字段字符串还是ISODate?

标签: mongodb mongoose aggregate


【解决方案1】:

试试这个:

Events.aggregate([
  {
    $group: {
      _id: {
        title: "$title",
        date: {
          $dateToString: {
            date: "$createdAt",
            format: "%Y-%m-%d"
          }
        }
      },
      count: {
        $sum: 1
      }
    }
  },
  {
    $group: {
      _id: "$_id.date",
      titles: {
        $push: {
          k: "$_id.title",
          v: "$count"
        }
      }
    }
  },
  {
    $addFields: {
      titles: {
        $mergeObjects: [
          {
            "date": {
              $concat: [
                "$_id",
                "T00:00:00.000Z"
              ]
            }
          },
          {
            $arrayToObject: "$titles"
          }
        ]
      }
    }
  },
  {
    $replaceWith: "$titles"
  }
]).exec();

MongoPlayground

【讨论】:

    猜你喜欢
    • 2020-11-09
    • 1970-01-01
    • 1970-01-01
    • 2019-03-03
    • 2018-07-30
    • 1970-01-01
    • 1970-01-01
    • 2017-10-08
    • 1970-01-01
    相关资源
    最近更新 更多