mongodb查询之从多种分类中获取各分类最新一条记录
2017年04月06日 13:02:47 monkey_four 阅读数 10955
解释下查询场景:
现在数据表里有多条记录信息,如果对某个字段分组后,会得到不同的分组,但是不需要求各分组的count,
只是想获取每个分组最新的一条全部信息记录。
例子:
有个vehicle_position表,代表车辆的位置信息,里面存放的记录如下:
-
{"vid" : "vid1", "position" : { "time" : NumberLong(1489458354), "latitude" : 0, "satellitesGa" : 0, "hdop" : 0, "speed" : 20, "longitude" : 0 } }
-
"vid" : "vid1", "position" : { "time" : NumberLong(1489458355), "latitude" : 0, "satellitesGa" : 0, "hdop" : 0, "speed" : 20, "longitude" : 0 } }
-
{ "vid" : "vid2", "position" : { "time" : NumberLong(1489458354),"latitude" : 0, "satellitesGa" : 0, "hdop" : 0, "speed" : 20, "longitude" : 0 } }
-
{ "vid" : "vid2", "position" : { "time" : NumberLong(1489458355),"latitude" : 0, "satellitesGa" : 0, "hdop" : 0, "speed" : 20, "longitude" : 0 } }
现在需求是给你一堆vid,让你查出车辆最近的位置信息,即position中的经纬度,我们不可能是一辆车一辆车的循环查。
我们可以这样写查询语句:
db.vehicle_position.aggregate([
{$match: {vin: {$in: ["vid1", "vid2"]}}},
{$group: {
_id: "$vin"
, "time": {$first: "$position.time"}
, "lng": {$first: "$position.longitude"}}},
{$sort:{"position.time":-1}}
])
查询结果如下:
-
{_id: "vid1", time: 1489458355, lng: 0, lat: 0}
-
{_id: "vid2", time: 1489458355, lng: 0, lat: 0}
主要就是用到了$group,$first操作符,注意需要排序。
nodejs代码块:
-
dataService.queryRealTimePosition = function(d, callback) {
-
var db = mongojs(mongoUri);
-
var vins = d.vins.split(";");
-
var condition = {vin: {$in: vins}};
-
db.collection(‘vehicle_position’).aggregate([
-
{$match: condition},
-
{$sort: {"position.time": -1}},
-
{$group: {_id: "$vin", "time": {$first: "$position.time"}, "lng": {$first: "$position.longitude"}, "lat": {$first: "$position.latitude"}}}], function(err, docs) { //注意,这里的sort操作要放在group前面进行
-
if(err) {
-
callback(err);
-
} else {
-
callback(null, docs);
-
}
-
db.close();
-
});
-
};
如果想获得最早的一条记录,将$first换成$last即可。或者不用替换,将sort排序换成增序。