MongoDB聚合 - 分组依据,在结果中选择其他字段

时间:2016-05-04 14:32:54

标签: mongodb aggregation-framework

我一直在尝试使用MongoDB Aggregation运算符来获取最后一条记录(基于' fixtm'这是修复时间)。每个记录都有一个设备ID,修复时间和一些其他信息,如纬度,经度,速度等。我的下面的聚合工作正常,它返回我每个设备的最后一条记录。但是我如何获得其他领域,如纬度,经度等?我已尝试在$ project列表中添加lat: 1之类的内容,但无论我尝试了多少变体,其他值都不会显示出来。我认为这是因为它们不存在于集团运营商的_id领域或其他什么地方?任何指针都会非常有用。感谢

function() {
    return db.gpspos.aggregate(
        [
            {
                $sort: {
                    devid: 1,
                    fixtm: 1
                }
            }, {
                $group: {
                    _id: "$devid",
                    lastData: {
                        $last: "$fixtm"
                    }
                }
            }, {
                $project: {
                    _id: 0,
                    device_id: '$_id',
                    fixtime: '$lastData'
                }
            }
        ]
    )
}

我从上面得到的是

{ "device_id" : 5, "fixtime" : 1462368405000 }
{ "device_id" : 4, "fixtime" : 1462372097000 }

我正在看的是这个

{ "device_id" : 5, "fixtime" : 1462368405000, "speed": 70.3, "lat": 103.33434 }
{ "device_id" : 4, "fixtime" : 1462372097000, "speed": 70.3, "lat": 101.33434 }

MongoDB中的文档示例

{
    "_id": {
        "$oid": "5729dc83f5be2411fb28c7c3"
    },
    "devid": 5,
    "devnm": "M.M (Samsung S3)",
    "fixtm": 1462360893000,
    "addr": "{address}",
    "lat": 1.433775,
    "lon": 103.7859717,
    "spdkm": 0
}

1 个答案:

答案 0 :(得分:2)

要同时返回其他字段,您可以在 $last 操作中使用相同的 $group 运算符。这将返回每个组的最后一个文档中的相应字段:

function() {
    return db.gpspos.aggregate(
        [
            {
                $sort: {
                    devid: 1,
                    fixtm: 1
                }
            }, {
                $group: {
                    _id: "$devid",
                    lastData: { $last: "$fixtm" },
                    speed: { $last: "$spdkm" },
                    address: { $last: "$address" },
                    lat: { $last: "$lat" },
                    lon: { $last: "$lon" }
                }
            }, {
                $project: {
                    _id: 0,
                    device_id: '$_id',
                    fixtime: '$lastData',
                    speed: 1,
                    address: 1,
                    lat: 1,
                    lon: 1
                }
            }
        ]
    )
}