mongodb - 查询具有 n 条记录的集合
问题描述
- 我有一个名为 GPS 的集合,每秒钟与服务器连接的 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 它查找整个数据而不是最后更新的数据。请问我该怎么做?谢谢
解决方案
我想你需要聚合,试试类似的东西。我在这里做的是首先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" }
}
}
]
)
推荐阅读
- sql - 从 SQL 中的 3 个连接表返回 1 条记录
- javascript - 如果存在重复值,则从数组中删除一个对象。JavaScript
- postgresql - 如何在 postgresql 中进行线性回归?
- html - CSS 背景不合适/被切断
- typescript - 不带参数的高阶函数的编译行为
- amazon-web-services - SQS 是否返回所有带有以下代码的消息?
- jcommander - 如何用 arity 0 或 1 定义参数
- xforms - 错误报告 XSLTForms 范围控制?
- python - 如何以pythonic方式重写此代码?
- java - 使用 office365 帐户的 Java 邮件