我正在根据不同日期制作的用户记录制作排名函数,而我正在尝试使用mongodb聚合函数。但是我不知道如何获得记录的正确日期。假设我有以下记录:
db.test.insert(
[
{
'name':'a',
'mark':100,
'created' : new Date('2015-03-20')
},
{
'name':'a',
'mark':208,
'created' : new Date('2015-03-21')
},
{
'name':'a',
'mark':200,
'created' : new Date('2015-03-22')
},
{
'name':'b',
'mark':240,
'created' : new Date('2015-03-25')
},
{
'name':'b',
'mark':20,
'created' : new Date('2015-11-20')
},
{
'name':'c',
'mark':225,
'created' : new Date('2015-11-21')
},
{
'name':'c',
'mark':305,
'created' : new Date('2015-11-22')
},
{
'name':'c',
'mark':300,
'created' : new Date('2015-11-22')
}
]
);
我有这样的查询:
db.test.aggregate([
{$group:{
"_id":"$name",
"mark" : {$max : "$mark"},
"name": {$min : "$name"},
"created" : {$max : "$created"}
}},
{$sort:{"mark":-1}}
])
我得到了结果:
{ "_id" : "c", "mark" : 305, "name" : "c", "created" : ISODate("2015-11-22T00:00:00Z") }
{ "_id" : "b", "mark" : 240, "name" : "b", "created" : ISODate("2015-11-20T00:00:00Z") }
{ "_id" : "a", "mark" : 208, "name" : "a", "created" : ISODate("2015-03-22T00:00:00Z") }
我希望用户b的最佳成绩是240,并在2015-03-25进行,用户获得最佳结果208并在2015-03-21进行。
我明白问题在于
...
"created" : {$max : "$created"}
...
但是我不知道应该放什么累加器,或者我有错误的想法来做这样的功能? 抱歉,我对mongodb很新,希望我能在这里有所了解。
由于
答案 0 :(得分:1)
您可以看到$first
。
db.collection.aggregate([
{$sort:{"name" : 1, "mark":-1}},
{$group:{
"_id":"$name",
"mark" : {$max : "$mark"},
createdDate: { $first: "$created" }
}}
]);
<强>输出: - 强>
{
"_id" : "a",
"mark" : 208,
"createdDate" : ISODate("2015-03-21T00:00:00.000Z")
}
{
"_id" : "b",
"mark" : 240,
"createdDate" : ISODate("2015-03-25T00:00:00.000Z")
}
{
"_id" : "c",
"mark" : 305,
"createdDate" : ISODate("2015-11-22T00:00:00.000Z")
}