Mongodb选择具有标准的不同对象

时间:2014-11-13 05:39:32

标签: mongodb mongodb-query aggregation-framework

我在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选择来选择它们?

顺便说一下,在我的案例中建立索引的任何建议?

1 个答案:

答案 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查看您可能习惯的一些常见查询示例及其翻译方式。