首页 文章

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

提问于
浏览
1

我一直在尝试使用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 回答

  • 2

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

    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
                    }
                }
            ]
        )
    }
    

相关问题