2014-03-25 61 views
0

我需要爲集合中的每個用戶獲取集合中的最新文檔。例如,讓我們假設我有數據是這樣的:爲每個用戶獲取集合中的最新文檔

[ 
    { user: "bob", time: ISODate("Sat, 24 Mar 2012 05:52:21 +0000"), value: "a" }, 
    { user: "bob", time: ISODate("Sun, 25 Mar 2012 05:52:21 +0000"), value: "b" }, 
    { user: "joe", time: ISODate("Sat, 24 Mar 2012 05:52:21 +0000"), value: "c" }, 
    { user: "bob", time: ISODate("Mon, 26 Mar 2012 05:52:21 +0000"), value: "d" }, 
    { user: "joe", time: ISODate("Sun, 25 Mar 2012 05:52:21 +0000"), value: "e" } 
] 

查詢後,我想找回這些條目:

[ 
    { user: "bob", time: ISODate("Mon, 26 Mar 2012 05:52:21 +0000"), value: "d" }, 
    { user: "joe", time: ISODate("Sun, 25 Mar 2012 05:52:21 +0000"), value: "e" } 
] 

我看到這個問題在這裏:MongoDB Map-Reduce Find Values from Last Record per User,但它並不完全似乎是我正在尋找的正確答案。我如何查詢這些數據?

+0

這是你的時間是如何格式化的,或者你只是刪除ISODate()部分的格式?如果他們實際上是字符串,那麼你有問題 –

+0

不,他們實際上是ISODate(),我只是爲了簡單而寫它。 – kbjr

回答

2

您可以使用$last運營商與.aggregate()的方法來做到這一點:

db.collection.aggregate([ 
    { "$sort": { "user": 1, "time": 1 } }, 
    { "$group": { 
     "_id": "$user", 
     "time": { "$last": "$time" }, 
     "value": { "$last": "$value" } 
    }} 
]) 

所以,你正在服用的「最後」項目從分組邊界返回值。在大多數情況下,使用$last實際上只有在排序後纔有意義,但是爲了增加像這樣的插入,該階段可能被排除。

值得注意的是,您也可以使用_id值代替$sort的時間戳,因爲它的值也始終增加。

相關問題