18

我有包含日期​​的文件,我想知道如何按季度对它们进行分组?

我的架构是:

var ekgsanswermodel = new mongoose.Schema({
    userId: {type: Schema.Types.ObjectId},
    topicId : {type: Schema.Types.ObjectId},
    ekgId : {type: Schema.Types.ObjectId},
    answerSubmitted :{type: Number},
    dateAttempted : { type: Date},
    title : {type: String},
    submissionSessionId : {type: String}  
});

第一季度包含月份 1、2、3。第二季度包含月份 4、5、6 等等,直到第四季度。

我的最终结果应该是:

 "result" : [ 
   {
     _id: {
        quater:
     },
     _id: {
        quater:
     },
    _id: {
        quater:
     },
     _id: {
        quater:
     }
  }
4

3 回答 3

22

您可以使用$cond运算符来检查:

  • 即,投影一个名为“one”$month的字段。<= 3quarter
  • 即,投影一个名为“二”$month的字段。<= 6quarter
  • 即,投影一个名为“三”$month的字段。<= 9quarter
  • 否则该字段的值quarter将是“第四”。
  • 然后$groupquarter场边。

代码:

db.collection.aggregate([
  {
    $project: {
      date: 1,
      quarter: {
        $cond: [
          { $lte: [{ $month: "$date" }, 3] },
          "first",
          {
            $cond: [
              { $lte: [{ $month: "$date" }, 6] },
              "second",
              {
                $cond: [{ $lte: [{ $month: "$date" }, 9] }, "third", "fourth"],
              },
            ],
          },
        ],
      },
    },
  },
  { $group: { _id: { quarter: "$quarter" }, results: { $push: "$date" } } },
]);

特定于您的架构:

db.collection.aggregate([
  {
    $project: {
      dateAttempted: 1,
      userId: 1,
      topicId: 1,
      ekgId: 1,
      title: 1,
      quarter: {
        $cond: [
          { $lte: [{ $month: "$dateAttempted" }, 3] },
          "first",
          {
            $cond: [
              { $lte: [{ $month: "$dateAttempted" }, 6] },
              "second",
              {
                $cond: [
                  { $lte: [{ $month: "$dateAttempted" }, 9] },
                  "third",
                  "fourth",
                ],
              },
            ],
          },
        ],
      },
    },
  },
  { $group: { _id: { quarter: "$quarter" }, results: { $push: "$$ROOT" } } },
]);
于 2015-02-03T05:53:37.650 回答
5

您可以使用以下功能按季度对文档进行分组。

{
    $project : {
        dateAttempted : 1,
        dateQuarter: {
            $trunc : {$add: [{$divide: [{$subtract: [{$month: 
            "$dateAttempted"}, 1]}, 3]}, 1]}
        }
    }
}
于 2019-01-18T15:43:07.010 回答
0

从 开始,它是新聚合运算符Mongo 5的完美用例:$dateTrunc

// { date: ISODate("2012-10-11") }
// { date: ISODate("2013-02-27") }
// { date: ISODate("2013-01-12") }
// { date: ISODate("2013-03-11") }
// { date: ISODate("2013-07-14") }
db.collection.aggregate([
  { $group: {
    _id: { $dateTrunc: { date: "$date", unit: "quarter" } },
    total: { $count: {} }
  }}
])
// { _id: ISODate("2012-10-01"), total: 1 }
// { _id: ISODate("2013-01-01"), total: 3 }
// { _id: ISODate("2013-07-01"), total: 1 }

$dateTrunc在它们的开头截断您的日期quarter(截断unit)。这是每季度日期的模数。

输出中的季度将由它们的第一天 ( Q3 2013will be 2013-07-01) 定义。例如,您始终可以使用$dateToString投影来调整它。

于 2021-12-04T10:03:38.923 回答