我在mongodb中使用了一个集合来保存用户每隔60秒发送一次手机的位置。
集合中的字段:uuid
(字符串),x
(数字),y
(数字),updated
(日期)
数据可能如下所示:
uuid x y updated
14 14.2038615 32.6570774 12:30:20
13 13.8059234 32.5008671 12:31:10
13 13.8061132 32.5008891 12:32:10
13 13.8061434 32.5008511 12:33:10
14 14.2039196 32.6570243 12:31:20
现在我想获得不同的设备(通过uuid)和最新的位置,如下所示:
uuid x y updated
14 14.2039196 32.6570243 12:31:20
13 13.8061434 32.5008511 12:33:10
现在我可以通过以下方式获得独特的手机:
db.location.distinct('uuid');
我可以获得指定deivce的最新位置:
db.location.find({uuid:12}).sort({updated:-1}).limit(1)
所以我可以选择不同的uuids,然后获取每个的最新位置,但我想知道我是否可以通过一个mongodb选择来选择它们?
顺便说一下,在我的案例中建立索引的任何建议?答案 0 :(得分:3)
你想要aggregation framework这里,而不是你正在尝试的其他命令。这允许"分组债券"要设置,所以你得到的结果与"多个" .find()
次查询:
db.location.aggregate([
{ "$sort": { "uuid": 1, "updated": -1 } },
{ "$group": {
"_id": "$uuid",
"x": { "$first": "$x" },
"y": { "$first": "$y" }
}}
])
理想情况下,您可能还希望在$match
阶段执行类似&#34的过程;将日期过滤到某个范围"或者基本上减少工作数据而不是遍历整个集合。这是一种很好的做法。
基本上你使用$sort
来命令结果如何打算" group"他们,这是由" uuid"并在"更新"订购。那么你$group
on" uuid"作为关键,在排序发生之后仅采用$first
匹配的项目,并且#34; uuid"边界。
你是如何通过对数据库的一次查询而不是循环所有可能的" uuid"个别查询中的值。
查看全部aggregation operators以获取更多用法示例,以及SQL to Aggregate Mapping Chart查看您可能习惯的一些常见查询示例及其翻译方式。