• 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排序换成增序。

  • 相关阅读:
    Golang语言编程规范
    关于redis的几件小事(三)redis的数据类型与使用场景
    关于redis的几件小事(二)redis线程模型
    关于redis的几件小事(一)redis的使用目的与问题
    关于MQ的几件小事(七)如果让你设计一个MQ,你怎么设计
    关于MQ的几件小事(六)消息积压在消息队列里怎么办
    关于MQ的几件小事(五)如何保证消息按顺序执行
    关于MQ的几件小事(四)如何保证消息不丢失
    关于MQ的几件小事(三)如何保证消息不重复消费
    关于MQ的几件小事(二)如何保证消息队列的高可用
  • 原文地址:https://www.cnblogs.com/grj001/p/12224356.html
Copyright © 2020-2023  润新知