首页 > 解决方案 > 查询具有 n 条记录的集合

问题描述

 {
     "_id" : ObjectId("5dd2d4f7d092fb70c022c700"),
     "date" : "2019-11-18",
     "altitude" : "0.0",
     "latdegree" : "N",
     "gpspositioning" : "V",
     "positionType" : "GPS",
     "latitude" : "12.900660",
     "range" : null,
     "gsmsignalstrength" : "46",
     "battery" : "87",
     "terminalstatus" : "00000000",
     "longitude" : "80.2347400",
     "satellites" : "0",
     "created" : "2019-11-18 17:29:26.991Z",
     "longdegree" : "E",
     "tumblingtimes" : "0",
     "positionaccuracy" : "52",
     "time" : "17:30:01.000Z",
     "locationDate" : "2019-11-18 17:30:01.000Z",
     "device" : "6005868660"
 }

所以现在我想用每个设备的最后更新值来查询这个集合,即 n 个设备作为数组。例如

[
  {
    device:1,
    lat:11,
    long:4111
  },
  {
    device:2,
    lat:11,
    long:4111
  },
  {
    device:3,
    lat:11,
    long:4111
  }
.....n]

我已经尝试使用 find 和 $natural 它查找整个数据而不是最后更新的数据。请问我该怎么做?谢谢

标签: mongodbmongoosemongodb-query

解决方案


我想你需要聚合,试试类似的东西。我在这里做的是首先locationDate按升序($sort:1)对数据进行排序(我猜它是设备的最后一个位置时间戳),然后按字段应用分组,device然后选择管道中的最后一个数据. 你也可以做$sort:-1(降序排序并选择$first

$last是做什么的?

返回将表达式应用于按字段共享同一组的一组文档中的最后一个文档所产生的值。仅当文档处于定义的顺序时才有意义。

 db.gps.aggregate(
       [
         { $sort: { locationDate: -1 } },
         {
           $group:
             {
               _id: "$device",
               latitude:{$first: "$latitude"},
               longitude: {$first: "$longitude"},
               lastupdateValue: { $first: "$locationDate" }
             }
         }
       ]
    )

或者

     db.gps.aggregate(
           [
             { $sort: { locationDate: 1 } },
             {
               $group:
                 {
                   _id: "$device",
                   latitude:{$last: "$latitude"},
                   longitude: {$last: "$longitude"},
                   lastupdateValue: { $last: "$locationDate" }
                 }
             }
           ]
        )

推荐阅读