按日期转换MongoDB集合

按日期转换MongoDB集合,mongodb,mapreduce,aggregation-framework,Mongodb,Mapreduce,Aggregation Framework,我有一个包含日期的模式集合。我想对查询的结果进行塑形,使其按年份和月份分组,而不是聚合,只是排序 我的模型是这样的: var RoundSchema=新模式({ 用户:{type:Schema.Types.ObjectId,ref:'user',必需:'{PATH}是必需的!', 课程:{type:Schema.Types.ObjectId,ref:'course',required:'PATH}是required!', 日期:{type:date,必需:{PATH}是必需的!', 分数:数字

我有一个包含日期的模式集合。我想对查询的结果进行塑形,使其按年份和月份分组,而不是聚合,只是排序

我的模型是这样的:

var RoundSchema=新模式({
用户:{type:Schema.Types.ObjectId,ref:'user',必需:'{PATH}是必需的!',
课程:{type:Schema.Types.ObjectId,ref:'course',required:'PATH}是required!',
日期:{type:date,必需:{PATH}是必需的!',
分数:数字
});
得到如下转换:

[
{
“年份”:2014年,
“月”:“四月”,
“回合”:[
{
“用户”:“5334d6650685f68c22aa460b”,
“日期”:“2014-04-23T05:00:00.000Z”,
“课程”:“5340ab6000806e2433864cfc”,
“得分”:73分,
_id:“534f102667d635381834367b”
},
{
“用户”:“5334d6650685f68c22aa460b”,
“日期”:“2014-04-21T05:00:00.000Z”,
“课程”:“5340ab6000806e2433864cfc”,
“得分”:75分,
_id:“534f100067d6353818343671”
}
]
},
{
“年份”:2014年,
“月”:“五月”,
“回合”:[
{
“用户”:“5334d6650685f68c22aa460b”,
“日期”:“2014-05-05T05:00:00.000Z”,
“课程”:“5337611d8d03819024515cf9”,
“分数”:81分,
_id:“534dc38780f1a854236203f3”
},
{
“用户”:“5334d6650685f68c22aa460b”,
“日期”:“2014-05-04T05:00:00.000Z”,
“课程”:“5337611d8d03819024515cf9”,
“得分”:77分,
_id:“534dc22c80f1a854236203e9”
}
]
}
]
我猜我可以在MongoDB中使用map reduce或聚合管道,但我无法理解语法。现在感觉像保龄球一样锐利


有人想让我开始吗?

这可以通过使用聚合框架简单地完成。这不仅适用于“求和”值,而且在文档重新成形方面也很出色

哪一个是您的最佳选择?似乎使用mapReduce可以使“非聚合”代码看起来更简单,因为该过程依赖于JavaScript解释器,而不是聚合框架的本机代码,因此mapReduce的运行速度会慢得多。在大数据上,情况相当严重

db.collection.aggregate([
//按年份和月份将所有项目放置在一个数组中
{“$组”:{
“_id”:{
“年”:{“$year”:“$date”},
“月”:{“$month”:“$date”},
},
“轮数”:{“$push”:{
“用户”:“$user”,
“日期”:“$date”,
“课程”:“$course”,
“分数”:“$score”,
“\u id”:“$\u id”
}}
}},
//按年度和月份对结果进行排序
{“$sort”:{“{id.year”:1,{id.date”:1},
//根据您的具体形式选择项目
{“$project”:{
“_id”:0,
“年”:“$\u id.year”,
“月”:“$\u id.month”,
“轮数”:1
}}
])
或者可能没有指定的数组,并将所有内容保持为平面形式:

db.collection.aggregate([
{“$project”:{
“年”:{“$year”:“$date”},
“月”:{“$month”:“$date”},
“用户”:1,
“日期”:1,
"课程":一,,
“分数”:1分
}},
{“$sort”:{“年”:1,“月”:1}
])
或者甚至按照您指定月份名称的确切方式执行:

db.collection.aggregate([
//按年份和月份将所有项目放置在一个数组中
{“$组”:{
“_id”:{
“年”:{“$year”:“$date”},
“月”:{“$month”:“$date”},
},
“轮数”:{“$push”:{
“用户”:“$user”,
“日期”:“$date”,
“课程”:“$course”,
“分数”:“$score”,
“\u id”:“$\u id”
}}
}},
//按年度和月份对结果进行排序
{“$sort”:{“{id.year”:1,{id.date”:1},
//可以选择投影到您的确切形式
{“$project”:{
“_id”:0,
“年”:“$\u id.year”,
“月份”:{“$cond”:[
{“$eq”:[“$\u id.month”:1]},
“一月”,
{“$cond”:[
{“$eq”:[“$\u id.month”:2]},
“二月”,
{“$cond”:[
{“$eq”:[“$\u id.month”:3]},
“三月”,
{“$cond”:[
{“$eq”:[“$\u id.month”:4]},
“四月”,
{“$cond”:[
{“$eq”:[“$\u id.month”:5]},
“五月”,
{“$cond”:[
{“$eq”:[“$\u id.month”:6]},
“六月”,
{“$cond”:[
{“$eq”:[“$\u id.month”:7]},
“七月”,
{“$cond”:[
{“$eq”:[“$\u id.month”:8]},
“八月”,
{“$cond”:[
{“$eq”:[“$\u id.month”:9]},
“9月”,
{“$cond”:[
{“$eq”:[“$\u id.month”:10]},
“十月”,
{“$cond”:[
{“$eq”:[“$\u id.month”:11]},
“11月”,
“12月”
]}
]}
]} 
]}
]} 
]}
]}
]}
]}                 
]}
]},
“轮数”:1
}}
])
这当然是矫枉过正,但只是为了证明这是可以做到的

当然,还有一个问题,所以你可以理解所使用的操作符的用法。您可能希望通过添加自己的