2016-12-02 4 views
0

다음 데이터가 있습니다. 내 결과를 범주 및 월별로 그룹화하고 전체를 반환하는 쿼리를 실행하고 싶습니다.월간 mongodb 그룹

원하는 첫 번째 출력은 범주별로 12 개월 동안 총 합계가있는 월 이름의 중첩 된 배열입니다. 데이터에없는 달은 여전히 ​​반환되지만 합계는 0입니다.

{"category":"Auto","month":{"Jan":9.12,"Feb":9.12,"Mar":0,...}}, 
{"category":"Fees","month":{..."Apr":0,"May":4.56,"Jun":0,...}}, 
{"category":"Travel","month":{..."Oct":0,"Nov":4.56,"Dec":0}} 

두 번째 원하는 출력은

{"category":"Auto","Jan":4.56,"Feb":4.56,"Mar":0,...}, 
{"category":"Fees",..."Apr":0,"May":4.56,"Jun":0,...}, 
{"category":"Travel",..."Oct":0,"Nov":0,"Dec":4.56,} 

어떻게 이러한 결과는 MongoDB를 함께 조회 할 수 있습니다 개월 중첩하지 않는 배열을 ...인가? 내가 SQL 측면에서 모든 이것에 대해 생각을 해 봤는데 느낄 수 있도록

{ 
    "_id" : ObjectId("583f6e6d14c8042dd7c153f1"), 
    "transid" : 1, 
    "category": "Auto", 
    "postdate" : ISODate("2016-01-28T05:00:00.000Z"), 
    "total" : 4.56 } 

{ 
    "_id" : ObjectId("583f6e6d14c8042dd7c153f2"), 
    "transid" : 5, 
    "category": "Auto", 
    "postdate" : ISODate("2016-01-31T05:00:00.000Z"), 
    "total" : 4.56 } 

{ 
    "_id" : ObjectId("583f6e6d14c8042dd7c153f3"), 
    "transid" : 3, 
    "category": "Auto", 
    "postdate" : ISODate("2016-02-28T05:00:00.000Z"), 
    "total" : 4.56 } 

{ 
    "_id" : ObjectId("583f6e6d14c8042dd7c153f4"), 
    "transid" : 2, 
    "category": "Auto", 
    "postdate" : ISODate("2016-02-31T05:00:00.000Z"), 
    "total" : 4.56 } 

{ 
    "_id" : ObjectId("583f6e6d14c8042dd7c153f5"), 
    "transid" : 6, 
    "category": "Fees", 
    "postdate" : ISODate("2016-05-16T05:00:00.000Z"), 
    "total" : 4.56 } 

{ 
    "_id" : ObjectId("583f6e6d14c8042dd7c153f6"), 
    "transid" : 7, 
    "category": "Travel", 
    "postdate" : ISODate("2016-11-13T05:00:00.000Z"), 
    "total" : 4.56 } 

내가 MongoDB를하고 SQL 배경에서 와서 새로 온 다음은 샘플 입력 데이터입니다.

아래는 mongodb 문서를 읽고 "SQL think"를 번역하려고 시도한 내용입니다. 본질적으로 지정된 연도 (이 경우 2016)로 필터링하려고합니다. 그런 다음 범주와 날짜별로 그룹화합니다. 그리고 마지막 단계에서 프로젝트와 $ cond 키워드를 사용하여 매월 시작일과 종료일을 지정하고 달 이름을 Jan, Feb 등으로 지정하여 달에 "하위 집계"할 계획입니다 ... 구문 오류가 있습니다. 이것이 올바른 접근인지 아니면 최선의 접근인지 나는 모른다.

db.transactions.aggregate(
    [ 
    { $match: { "postdate": {$gte: new Date("2016-01-01")}} }, 
    { $group: { _id: {"category":"$category","postdate":"$postdate"} , "total": { $sum: "$debit" } } }, 
    { $project: {"_id":0,"category":"$_id.category", 
     "month":{$cond: { 
          $and: 
           [ 
            { $gte: ["$_id.postdate", new Date("2016-01-01")] }, 
            { $lt: ["$_id.postdate", new Date("2016-02-01")] }, 
           ] 
          },"Jan":"$sum"} 
       //repeat for all other 11 months... 
    }} 
    ] 
) 
+0

첫 번째 시나리오에서 원하는 출력에 가까워지는 해결책을 찾았지만 몇 달 만에 나올 수 있기 때문에 약간의 조정이 필요합니다. 나는 그걸 가지고 계속 놀아 나갈 것이지만, 그것은 올바른 길을 걷는 사람을 세울 것입니다. 이 솔루션을 다른 포스트에서 찾았습니다 : [link] http://stackoverflow.com/questions/25843255/mongodb-aggregate-count-on-multiple-fields-simultaneously –

+0

여기까지 제가 가지고있는 것이 있습니다 :'db.transactions { "$ group": { "_id": { "카테고리 ({{$ match : {"postdate ": {$ gte : 새로운 날짜 ("2016-01-01 ")}}} ""$ category ", "월 ": {"$ month ":"$ postdate "} }, "total ": {"$ sum ":"$ total "} }}, { group ": { "_id ":"$ _id.category ", "월 ": {"$ push ": {"month ":"$ month ","total ":"$ total "}} }} ])' –

답변

0

월별로 그룹화하려는 경우 월 운영자를 사용할 수 있습니다. 예 :

db.transaction.aggregate([{$group:{_id:{ $month:"$postdate"}, "total":{$sum:1}}}]) 

어떤 프로젝트가 당신을 위해하고 있는지 잘 모릅니다.