根据Group Mongoose查找最新logging

我对NoSQL相当陌生,并且努力编写这个查询,我在Node.js上使用Mongoose

我想要实现的是根据设备ID组获得最新的一个结果。 我在SQL中写这个没有问题,但是在NoSQL中很难做到这一点。

这里是模型设置

_id DeviceID Coordinate:{lat, long} 1 2 lat: 1, long: 2 2 3 lat: 2, long: 3 3 1 lat: 3, long: 3 4 3 lat: 5, long: 4 5 2 lat: 7, long: 5 6 2 lat: 9, long: 6 7 3 lat: 111, long: 7 8 2 lat: 113, long: 8 

我想要的输出是:

 _id DeviceID Coordinate:{lat, long} 3 1 lat: 3, long: 3 7 3 lat: 111, long: 7 8 2 lat: 113, long: 8 

这是我所尝试的,但我得到的结果是undefined

注意: beginDayIDendDayIDendDayID的variablesObjectId代表天的开始和结束的_id。

 mongoose.model('GPSData').aggregate([ {$match: {_id:{$gte: beginDayID, $lt: endDayID}}}, {$unwind: "$Coordinates"}, {$project: {DeviceID: '$DeviceID' }}, {$group: { DeviceID: '$DeviceID', $lat: '$Coordinates.lat', $long: '$Coordinates.long'}} ], (e, data) => { console.error(e) console.log(data) if (e) return callback(e, null); return callback(null, data); }) 

我假设你有这样的文件有点类似

 /* 1 */ { "_id" : 1, "DeviceID" : 1, "Coordinate" : { "lat" : 1, "long" : 2 } } /* 2 */ { "_id" : 2, "DeviceID" : 2, "Coordinate" : { "lat" : 1, "long" : 6 } } ... 

那么像这样的聚合pipe道应该工作

 mongoose.model('GPSData').aggregate([ { $match: ... // your match filter criteria }, { $sort: { _id: 1 } }, { $group: { _id: '$DeviceID', lastId: { $last: '$_id' }, lat: { $last: '$Coordinate.lat' }, long: { $last:'$Coordinate.long' } } }, { $project: { _id: '$lastId', DeviceID: '$_id', lat: 1, long: 1 } } ]) 

输出文件的形状看起来像这样

 /* 1 */ { "_id" : 1, "DeviceID" : 1, "Coordinate" : { "lat" : 1, "long" : 2 } } /* 2 */ { "_id" : 2, "DeviceID" : 2, "Coordinate" : { "lat" : 1, "long" : 6 } } 

注意$sort的附加阶段,因为在谈到保留“最后的值”时你必须指定一个顺序。 如果您有其他要求,您可能需要指定其他sorting