MongoDB过滤来自结果的重复用户

时间:2014-08-21 11:35:49

标签: php mongodb doctrine

我有一个mongo集合,其中包含以下格式的活动:

{
  "_id": 1,
  "user": 1,
  "time": 12345,
  "data": ...
}

现在我想从这个集合中获取5个最新条目(整个条目),但是如果在最新活动中有多个来自用户的活动,我希望每个用户只有一个条目。我不想在数据库查询后过滤结果。我希望在数据库服务器上有一个mongoDB方法。

我想用Doctrine MongoDB ODM执行此查询,但我怀疑使用提供的方法无法做到这一点。但直接的mongo查询也很好。

1 个答案:

答案 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 }