试图建立一个基于mongodb,aggregate的排名功能

时间:2016-09-18 18:20:13

标签: mongodb aggregation-framework

我正在根据不同日期制作的用户记录制作排名函数,而我正在尝试使用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很新,希望我能在这里有所了解。

由于

1 个答案:

答案 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")
}