2014-03-25 60 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的时间戳,因为它的值也始终增加。

相关问题