如何在MongoDB中按季度分组日期

时间:2015-02-03 04:13:03

标签: mongoose mongodb-query

我有一份包含日期的文件,我想按季度分组文件。 我怎么能在MongoDB中做到这一点? 我的架构是:

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

2 个答案:

答案 0 :(得分:15)

您可以使用$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"}}}
])

答案 1 :(得分:0)

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

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