mongodb查询之从多种分类中获取各分类最新一条记录

mongodb查询之从多种分类中获取各分类最新一条记录

2017年04月06日 13:02:47 monkey_four 阅读数 10955

解释下查询场景: 

现在数据表里有多条记录信息,如果对某个字段分组后,会得到不同的分组,但是不需要求各分组的count,

只是想获取每个分组最新的一条全部信息记录。

例子:

有个vehicle_position表,代表车辆的位置信息,里面存放的记录如下:

  1. {"vid" : "vid1", "position" : { "time" : NumberLong(1489458354), "latitude" : 0, "satellitesGa" : 0, "hdop" : 0, "speed" : 20, "longitude" : 0 } }

  2. "vid" : "vid1", "position" : { "time" : NumberLong(1489458355), "latitude" : 0, "satellitesGa" : 0, "hdop" : 0, "speed" : 20, "longitude" : 0 } }

  3. { "vid" : "vid2", "position" : { "time" : NumberLong(1489458354),"latitude" : 0, "satellitesGa" : 0, "hdop" : 0, "speed" : 20, "longitude" : 0 } }

  4. { "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}}
])

查询结果如下:


 
  1. {_id: "vid1", time: 1489458355, lng: 0, lat: 0}

  2. {_id: "vid2", time: 1489458355, lng: 0, lat: 0}

主要就是用到了$group,$first操作符,注意需要排序。

nodejs代码块:


 
  1. dataService.queryRealTimePosition = function(d, callback) {

  2. var db = mongojs(mongoUri);

  3. var vins = d.vins.split(";");

  4. var condition = {vin: {$in: vins}};

  5. db.collection(‘vehicle_position’).aggregate([

  6. {$match: condition},

  7. {$sort: {"position.time": -1}},

  8. {$group: {_id: "$vin", "time": {$first: "$position.time"}, "lng": {$first: "$position.longitude"}, "lat": {$first: "$position.latitude"}}}], function(err, docs) { //注意,这里的sort操作要放在group前面进行

  9. if(err) {

  10. callback(err);

  11. } else {

  12. callback(null, docs);

  13. }

  14. db.close();

  15. });

  16. };


如果想获得最早的一条记录,将$first换成$last即可。或者不用替换,将sort排序换成增序。

原文地址:https://www.cnblogs.com/grj001/p/12224356.html