2012-10-23 4 views
0

새로운 MongoDB 집계 기능을 사용하여 일부 통계를 날짜별로 집계하려고합니다. 아래는 내가 작업하고있는 문서 샘플, 시도한 코드 및 원하는 결과입니다. 집계 함수는 "UNDEFINED"를 리턴합니다. 누군가가 왜 그런지 말해 줄 수 있습니까? 둘째, 결과를 날짜별로 mm-dd-yyyy 형식으로 그룹화하는 집계 함수를 원합니다. 그러나 현재 작성된대로 코드는 전체 ISO 날짜별로 집계를 실행한다고 생각합니다. 누군가이 문제를 해결할 수있는 방법을 알려주실 수 있습니까?MongoDB 집계 함수 반환하지 않음

문서의 예

{ 
    user: "2A8761E4-C13A-470E-A759-91432D61B6AF-25982-0000352D853511AF", 
    language: "English", 
    imageFileName: "F7A5ED9-D43C-4671-A5C6-F06C7E41F902-7758-000008371FB5B834", 
    audioFileName: "F6D5727D-9377-4092-A28A-AA900F02653D-7758-0000083749066CF2", 
    date: ISODate("2012-10-22T02:43:52Z"), 
    correct: "1", 
    _id: ObjectId("5084b2e8179c41cc15000001") 
} 

집계 함수

var getUserStats = function(user, language, callback) { 
    var guessCollection = db.collection('Guesses'); 
    guessCollection.aggregate(
    { $match: { 
    user: user, 
    language: language, 
    }}, 
    { $sort: { 
    date: 1 
    }}, 
    { $project : { 
    user : 1, 
      language : 1, 
      date : 1, 
      correct : 1, 
      incorrect : 1, 
    } }, 
    { $unwind : "$language" }, 
    { $group : { 
    _id : "$date", 
      correct : { $sum : "$correct" }, 
      incorrect : { $sum : "$incorrect" } 
    } } 
, function(err, result){ 
    console.log(result); 
    callback(result); 
}); 

원하는 결과가 undefined 반환에 대한 귀하의 첫 번째 질문에 대해서는

{ 
     "result" : [ 
    //...snip... 
      { 
       "_id" : "2A8761E4-C13A-470E-A759-91432D61B6AF-25982-0000352D853511AF", 
       "correct" : 32, 
       "incorrect" : 17, 
       "date" : 2012-10-22 
      }, 
{ 
       "_id" : "2A8761E4-C13A-470E-A759-91432D61B6AF-25982-0000352D853511AF", 
       "correct" : 16, 
       "incorrect" : 7, 
       "date" : 2012-10-23 
      } 
     ], 
     "Ok" : 1 
    } 

답변

3

, 두 가지 문제가있다 :

  1. $unwind 연산자는 배열이 아닌 필드 ($language)에서 사용하고 있습니다.
  2. 문자열 필드 ($correct)에 $sum 연산자를 사용하고 있습니다. 숫자 입력란에서만 지원됩니다. 예를 들어

    : 그냥 날짜에 그룹화에 대한 두 번째 질문에 대한

, 당신은 $group 운영자의 _id 값에 해당 구성 요소를 사용하여 다음에 그룹에 원하는 날짜 구성 요소를 투영하고 필요

[ { _id: { year: 2012, month: 10, day: 22 }, 
    correct: 0, 
    incorrect: 0 } ] 
:
test.aggregate(
    { $match: { 
     user: user, 
     language: language 
    }}, 
    { $sort: { 
     date: 1 
    }}, 
    { $project : { 
     user : 1, 
     language : 1, 
     year : { $year: '$date' }, 
     month : { $month: '$date' }, 
     day : { $dayOfMonth: '$date'}, 
     correct : 1, 
     incorrect : 1 
    }}, 
    { $group : { 
     _id : { year: "$year", month: "$month", day: "$day" }, 
     correct : { $sum : "$correct" }, 
     incorrect : { $sum : "$incorrect" } 
    }}, 
    function(err, result){ 
     console.log(result); 
    } 
); 

는의 출력을 생성

코드를 '2012-10-22'으로 어셈블 할 수 있습니다.

+0

둘 모두를 수정하십시오. 나는 당신의 대답의 두 부분을 모두 시험해 보았고 아름답게 작동합니다. 매우 감사합니다! +1 – hughesdan