MongoDB查询最新数据?

时间:2016-08-16 18:56:58

标签: javascript mongodb aggregation-framework

我的数据看起来像这样:

{
"name" : "Name1",
"monthson" : "4",
"data" : "OLD DATA FOR 1"
},
{
"name" : "Name1",
"monthson" : "5",
"data" : "LATEST DATA FOR 1"
},
{
"name" : "Name2",
"monthson" : "7",
"data" : "OLD DATA FOR 2"
},
{
"name" : "Name2",
"monthson" : "8",
"data" : "LATEST DATA FOR 2"
}

我试图找出按每个名称对所有内容进行分组然后输出最新数据的方法。 (monthon表示每组活跃的月数,因此最高月份是最近的月份。)

我的Mongo查询看起来像这样:

db.collection.aggregate(
        [
            {$match: {$in: ["name1", "name2"]}}
            {$group:
            {
                _id:"$name",
                monthson:{$max: "$monthson"},
                data: {$addToSet: "$data"}
            }},
        ])

输出如下:

{
_id:"Name1",
monthson: 5,
data: ["OLD DATA FOR 1", " LATEST DATA FOR 1"]
}
{
_id:"Name2",
monthson: 8,
data: ["LATEST DATA FOR 2", "OLD DATA FOR 2"]
}

技巧是每当我运行此查询时,它会将每组数据添加到我的结果中,而我只需要与最高月份相对应的数据。我无法查询第一个,最后一个或最高数据,因为它们将始终按随机顺序排列。

1 个答案:

答案 0 :(得分:3)

您可以使用 $ sort 来获取所需的订单(我先使用最旧的订单),然后使用 $ first 来获取第一个(最早的)匹配记录每个"名称"

db.collection.aggregate([
    {
        $match: {name: {$in: ["Name1", "Name2"]}}
    },
    {
        $sort: {monthson:-1}
    },
    {   
        $group: {
                _id:"$name",
                first:{$first: "$$ROOT"}
        }
    }
])