MongoDB查询到distinct,sort,limit和offset

时间:2013-01-10 21:34:46

标签: sql mongodb

我正在寻找以下的Mongo:

select distinct event_type_id from events
order by created_at desc
limit 10,20

Event Mongo文件如下:

{
  _id: BSON(), event_type_id: 1, created_at: Date(), other_data: {}
}

3 个答案:

答案 0 :(得分:6)

您可以在新的mongo版本上使用Aggregation Framework。以下是开始的示例:

db.events.aggregate([
    {$sort:{"created_at":-1}},
    {$project:{"event_type_id":1}},
    {$group:{"_id":"$event_type_id"}},
    {$skip:10},
    {$limit:20}
])

这是另一种方法,感谢@JoachimIsaksson

db.events.aggregate([
    {$group:{"_id":"$event_type_id", "created_at":{$max:"$created_at"}}},
    {$sort:{"created_at":-1}},
    {$skip:10},
    {$limit:20},
    {$project:{"event_type_id":1}}
])

答案 1 :(得分:3)

您始终可以通过v2.2中引入的聚合框架执行此操作:

db.col.aggregate(
    {$group: {_id: "$event_type_id", created_at: "$created_at"}},
    ($sort: {"$created_at":-1}
);

这样的东西将分组,这将是真正相同的,所有event_type_id值并按created_at降序排序。

这应该没问题,但要注意它目前有16meg的输出限制(atm),所以如果你想输出一个巨大的文档,你可能会发现它很难。

修改

对于性能,您实际上可以首先使用索引进行排序,然后使用$group

db.col.aggregate(
    { $sort: {"$created_at":-1} },
    { $group: {_id: "$event_type_id", created_at: {$first: "$created_at"}} }
);

这使用$firsthttp://docs.mongodb.org/manual/reference/aggregation/first/)运算符来获取该组中该字段的第一个值。您也可以使用$last运算符,这些运算符当然会转换为普通$min$max,但是对于有序集合。

答案 2 :(得分:1)

我认为你不能将限制和跳过命令与mongo中的不同查询结合起来。下面的代码将返回以下sql语句的等价物:

select distinct event_type_id from events
order by created_at desc

db.events.distinct( 'event_type_id', {}, {createdAt: -1} })

检索结果后,您可以根据需要从中提取子集。您也可以查看以下帖子:How to use Distinct, Sort, limit with mongodb

显然这是关于mongo社区的开放票,你也可以查看问题,看起来他们不会实现限制和明显的组合一段时间https://jira.mongodb.org/browse/SERVER-2130

相关问题