2015-02-03 14 views
9

Mam dokument, który zawiera datę i chcę zgrupować dokument według kwartalnie. Jak mogę to zrobić w MongoDB?
Moje schematu jest:Jak pogrupować datę co kwartał w 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 kwartał zawierać Miesięcy 1, 2, 3. 2 kwartał zawierają miesiące 4, 5, 6 i tak dalej w górę do 4 kwartału. Moja ostateczna odpowiedź powinna być:

"result" : [ 
    { 
    _id: { 
     quater: 
    }, 
    _id: { 
     quater: 
    }, 
    _id: { 
     quater: 
    }, 
    _id: { 
     quater: 
    } 
    } 
+0

próbowałeś użyciu MapReduce MongoDB jest? http://docs.mongodb.org/manual/core/map-reduce/ Myślę, że możesz odwzorować swoje miesiące zaokrąglone MonthNumber/4. Coś jak emituj (this.number/4, this.number). A w części REDUCE grupujesz wszystkie miesiące. – AzaFromKaza

+0

Nie próbowałem mapreduce. może dać mi przykład. dodałem także schemat powyżej. –

+0

Nie martw się moim rozwiązaniem @grishabh, ten poniżej jest lepszy. Mongodb mapreduce nie pozwala na posiadanie tablicy w wyniku zmniejszenia działania. Odnośnik: http://stackoverflow.com/questions/8175015/mongodb-mapreduce-reduce-multiple-not-supported-yet – AzaFromKaza

Odpowiedz

11

Można skorzystać z operatora $cond aby sprawdzić, czy:

  • $month jest <= 3, projekt pole o nazwie quarter z wartości jako „jeden”.
  • Obiekt $month jest <= 6, wyświetla pole o nazwie quarter o wartości jako "dwa".
  • Obiekt $month jest <= 9, wyświetla pole o nazwie quarter o wartości jako "trzy".
  • W przeciwnym razie wartość pola quarter będzie "czwarta".
  • Następnie $group przez pole quarter.

Kod:

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

specyficzne dla danego schematu:

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

thanx @BatScream, Proszę, możesz zrobić to zapytanie w spring-data-mongodb. – user1503117

Powiązane problemy