5

我正在寻找相当于以下内容的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: {}
}
4

3 回答 3

8

您可以在新的 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}}
])
于 2013-01-10T22:22:59.163 回答
2

您始终可以通过 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"}} }
);

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

于 2013-01-10T22:18:34.580 回答
0

我认为您不能将限制和跳过命令与 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

于 2013-01-10T22:10:03.980 回答