我有一个mongo集合,其中包含以下格式的活动:
{
"_id": 1,
"user": 1,
"time": 12345,
"data": ...
}
现在我想从这个集合中获取5个最新条目(整个条目),但是如果在最新活动中有多个来自用户的活动,我希望每个用户只有一个条目。我不想在数据库查询后过滤结果。我希望在数据库服务器上有一个mongoDB方法。
我想用Doctrine MongoDB ODM执行此查询,但我怀疑使用提供的方法无法做到这一点。但直接的mongo查询也很好。
答案 0 :(得分:1)
您没有使用time
的日期值,因此我将假设"最新的"表示time
"中最大的数字。其次,我将获得前2个最新条目,每个用户最多一个。我们的想法是,只有time
的最高值对每个用户都很重要,所以我们只需$group
user
排序time
,同时从$first
投影字段值{1}} $group
看到的结果,然后排在前2位。该示例位于mongo shell中。
> db.user.find()
{ "_id" : 1, "user" : 1, "time" : 12345, "data" : 48 }
{ "_id" : 2, "user" : 1, "time" : 12346, "data" : 32 }
{ "_id" : 3, "user" : 2, "time" : 347, "data" : 2 }
{ "_id" : 4, "user" : 2, "time" : 384, "data" : 99 }
{ "_id" : 5, "user" : 2, "time" : 384, "data" : 66 }
{ "_id" : 6, "user" : 3, "time" : 3384, "data" : 55 }
{ "_id" : 7, "user" : 3, "time" : 33844, "data" : 3 }
> db.user.aggregate([
{ "$sort" : { "time" : -1 } },
{ "$group" : {
"_id" : "$user",
"time" : { "$first" : "$time" },
"data" : { "$first" : "$data" }
}
},
{ "$sort" : { "time" : -1 } },
{ "$limit" : 2 }
])
{ "_id" : 3, "time" : 33844, "data" : 3 }
{ "_id" : 1, "time" : 12346, "data" : 32 }