mongodb 如何按季度分组约会?

ffscu2ro  于 2023-01-25  发布在  Go
关注(0)|答案(3)|浏览(111)

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

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:
     }
  }
z4bn682m

z4bn682m1#

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

  • $month<= 3,投影一个名为quarter且值为"一"的字段。
  • $month<= 6,投影一个名为quarter的字段,其值为"2"。
  • $month<= 9,投影一个名为quarter的字段,其值为"3"。
  • 否则字段quarter的值将是"第四"。
  • 然后$group乘以quarter字段。

代码:

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" } } },
]);
z3yyvxxp

z3yyvxxp2#

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

{
    $project : {
        dateAttempted : 1,
        dateQuarter: {
            $trunc : {$add: [{$divide: [{$subtract: [{$month: 
            "$dateAttempted"}, 1]}, 3]}, 1]}
        }
    }
}
qyzbxkaa

qyzbxkaa3#

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 }

$dateTruncquarter的开头截断日期(截断unit),这是一种对每季度日期的取模。
输出中的季度将由它们的第一天定义(Q3 2013将为2013-07-01),并且您可以随时使用$dateToString投影来调整它。

相关问题