我有一个SQL查询的工作示例:
SELECT a.user_id, a.latitude, a.longitude, a.accuracy, a.heading, a.speed, a.created_at
FROM `location` a
INNER JOIN (
SELECT user_id, MAX(`created_at`) created_at
FROM location
WHERE created_at > :date
GROUP BY `user_id`
) b ON a.`user_id` = b.`user_id` AND a.`created_at` = b.`created_at`为每个用户选择今天的最后一个位置
如何在MongoDB中执行此查询?
我在php中得到了它的第一部分(子查询):
$mongodb->getCollection('location')->aggregate([
['$match' => ['created_at' => ['$gte' => $beginOfDay]]],
[
'$group' => [
'_id' => '$user_id',
'lastTime' => ['$max' => '$created_at']
]
]
]);并且不想创建新的查询...
也许在MongoDB中比在关系数据库中更容易做到呢?
发布于 2017-01-26 00:46:14
我会尝试不同的方式,而不是映射SQL查询。下面是聚合。
db.location.aggregate([
{$match : {$gte : beginOfDay}},
{$sort : {'user_id' : 1, 'created_at' : -1}},
{$group : {
_id : '$user_id',
created_at: { $first: "$created_at" },
latitude: { $first: "$latitude" },
longitude: { $first: "$longitude" },
// ....similarly other fields
}
}
]);它主要做的是通过过滤所有具有当天创建的数据的用户的文档进行聚合,然后按user_id和降序created_at排序,然后在分组阶段,对于每个user_id,它在$first运算符的帮助下获得第一个文档数据。
我不确定如何转换为php方式,或者php驱动程序是否允许$first,但值得一试。
https://stackoverflow.com/questions/41853992
复制相似问题