我正在寻找相当于以下内容的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: {}
}
您可以在新的 mongo 版本上使用聚合框架。这是开始的示例:
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}}
])
您始终可以通过 v2.2 中引入的聚合框架执行此操作:
db.col.aggregate(
{$group: {_id: "$event_type_id", created_at: "$created_at"}},
($sort: {"$created_at":-1}
);
像这样的东西将分组,这实际上与 distinct 相同,所有event_type_id
值并按降序排序created_at
。
这应该没问题,但请注意,目前它的输出限制 (atm) 为 16meg,因此如果您要输出一个巨大的文档,您可能会发现它很困难。
为了提高性能,您实际上可以先使用索引进行排序,然后$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
但用于排序集。
我认为您不能将限制和跳过命令与 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 社区的一张公开票,您也可以检查问题,看起来他们暂时不会实现 limit 和 distinct 的组合https://jira.mongodb.org/browse/SERVER-2130