如何按季度分组日期?
How to group date quarterly wise?
我有包含日期的文档,我想知道如何按季度对它们进行分组?
我的架构是:
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 个月。第 2 季度包含第 4、5、6 个月,依此类推,直到第 4 季度。
我的最终结果应该是:
"result" : [
{
_id: {
quater:
},
_id: {
quater:
},
_id: {
quater:
},
_id: {
quater:
}
}
您可以使用 $cond
运算符来检查是否:
-
$month
是 <= 3
,投影一个名为 quarter
的字段
值为“一”。
-
$month
是 <= 6
,投影一个名为 quarter
的字段
值为“二”。
$month
是 <= 9
,投影一个名为 quarter
的字段
值为“三”。
- 否则字段
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" } } },
]);
您可以使用以下内容按季度对文档进行分组。
{
$project : {
dateAttempted : 1,
dateQuarter: {
$trunc : {$add: [{$divide: [{$subtract: [{$month:
"$dateAttempted"}, 1]}, 3]}, 1]}
}
}
}
从 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 2013
将是 2013-07-01
)。你可以随时使用 $dateToString
投影来调整它。
我有包含日期的文档,我想知道如何按季度对它们进行分组?
我的架构是:
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 个月。第 2 季度包含第 4、5、6 个月,依此类推,直到第 4 季度。
我的最终结果应该是:
"result" : [
{
_id: {
quater:
},
_id: {
quater:
},
_id: {
quater:
},
_id: {
quater:
}
}
您可以使用 $cond
运算符来检查是否:
-
$month
是<= 3
,投影一个名为quarter
的字段 值为“一”。 -
$month
是<= 6
,投影一个名为quarter
的字段 值为“二”。 $month
是<= 9
,投影一个名为quarter
的字段 值为“三”。- 否则字段
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" } } },
]);
您可以使用以下内容按季度对文档进行分组。
{
$project : {
dateAttempted : 1,
dateQuarter: {
$trunc : {$add: [{$divide: [{$subtract: [{$month:
"$dateAttempted"}, 1]}, 3]}, 1]}
}
}
}
从 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 2013
将是 2013-07-01
)。你可以随时使用 $dateToString
投影来调整它。