다음 데이터가 있습니다. 내 결과를 범주 및 월별로 그룹화하고 전체를 반환하는 쿼리를 실행하고 싶습니다.월간 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...
}}
]
)
첫 번째 시나리오에서 원하는 출력에 가까워지는 해결책을 찾았지만 몇 달 만에 나올 수 있기 때문에 약간의 조정이 필요합니다. 나는 그걸 가지고 계속 놀아 나갈 것이지만, 그것은 올바른 길을 걷는 사람을 세울 것입니다. 이 솔루션을 다른 포스트에서 찾았습니다 : [link] http://stackoverflow.com/questions/25843255/mongodb-aggregate-count-on-multiple-fields-simultaneously –
여기까지 제가 가지고있는 것이 있습니다 :'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 "}} }} ])' –