2017-01-25 64 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'] 
     ] 
    ] 
]); 

和我就不會要創建新的查詢......

也許在MongoDB中它很容易做的比在關係D B?

+1

什麼是收集格式/形狀ans所需的輸出? – 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驅動程序允許$首先或不肯定,但值得一試。

+0

是的,它的工作原理! 最終結果: '$ locations = $ mongodb-> getCollection('location') - > aggregate([['$ match'=> ['created_at'=> ['$ gte'=> $ beginOfDay]]] ['$ sort'=> ['created_at'=> -1]],['$ group'=> ['_id'=>'$ user_id','latitude'=> ['$ first'=>'$緯度'],'經度'=> ['$ first'=>'$ longitude'],'accuracy'=> ['$ first'=>'$ accuracy'],'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']。我想這些應該工作。 –