2017-01-25 4 views
0

У меня есть рабочий пример запроса SQL: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'] 
     ] 
    ] 
]); 

и would't хотите создать новые запросы ...

Может быть, в MongoDB это делается легко, чем в реляционную DB?

+1

Что такое формат коллекции/форма и желаемый результат? – felipsmartins

ответ

0

Я бы попытался сделать это иначе, вместо сопоставления 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 или не уверен, но стоит попробовать.

+0

да, это работает! Окончательный результат: '$ locations = $ mongodb-> getCollection ('location') -> aggregate ([['$ match' => ['created_at' => ['$ gte' => $ beginOfDay]]], ['$ sort' => ['created_at' => -1]], ['$ group' => ['_id' => '$ user_id', 'latitude' => ['$ first' => '$ широта '],' longitude '=> [' $ first '=>' $ longitude '],' precision '=> [' $ first '=>' $ precision '],' heading '=> [' $ first ' => '$ heading'], 'speed' => ['$ first' => '$ speed'], 'created_at' => ['$ first' => '$ created_at']]]]); ' –

+0

Другой вопрос, как я могу получить ключ' _id' 'user_id'? –

+0

Рад, что это помогло, я бы сказал, добавив еще одно поле в групповом этапе, что-то вроде «user_id» => ['$ first' => '$ user_id'], в этом случае вы получите как _id, так и user_id как значение user_id , если вы хотите оригинал _id документа, я бы использовал что-то вроде «o_id» => ['$ first' => '$ _id']. Думаю, они должны работать. –

 Смежные вопросы

  • Нет связанных вопросов^_^