我正在寻找以下的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: {}
}
答案 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"}} }
);
这使用$first
(http://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