如何获取mongodb中每组的最新N记录?

时间:2015-12-17 02:37:55

标签: node.js mongodb mongoose

每个城市都有几个参赛作品。如何获得每个城市最新的3个条目?像:

City1
记录1
记录2
记录3

城2
记录1
记录2
记录3

请分享帮助
记录1
记录2
记录3

架构:

var schema = mongoose.Schema({
  city: {type: String},
  title: {type: String},
  created: {type: Number, default: Math.floor(new Date() / 1000)}
})

我试过的代码:

Collection
.find('location $in ' + cities)
.aggregate({$group: {location: "$location"}})
.sort('created: 1')
.limit(3).exec(function(err, docs) { res.render('index', { hash: docs }); });

那么,如何执行我应该得到的查询结果:每个城市的3个最新标题

1 个答案:

答案 0 :(得分:4)

mongoDB 3.2 中,您可以使用以下格式的汇总查询来执行此操作:

db.collection.aggregate(
  {$sort: {created: -1}},
  {$group: {_id:'$city', title:{$push: '$title'}},
  {$project: {_id:0, city: '$_id', mostRecentTitle: {$slice: ['$title', 0, 2]}}}
)

使用mongoDB 3.0很难实现同样的目标。一个非常脏的技巧是在3.0中实现这一点。它涉及几个步骤和其他集合。

首先进行聚合并将结果输出到名为'aggr_out'的临时集合

<强>查询:

db.collection.aggregate([
  {$sort: {created: -1}},
  {$group: {_id:'$city', title:{$push: '$title'}},
  {$project: {city: '$_id', mostRecentTitle: '$title'}},
  {$out: 'aggr_out'}]
)

使用上面的查询,mostRecentTitle将包含从索引0,1,2 ......开始排序的所有最新标题。如果您对此结果感到满意,请使用此结果,因为您已经在mostRecentTitle的索引0,1和2中得到了结果。在应用程序方面可以简单地忽略其他标题。

如果您不满意,请对输出集合'aggr_out'进行更新,并从此集合中读取数据。查询是,

db.aggr_out.update(
  {},
  {$push: {
    mostRecentTitle: {$each:[], $slice:3}
    }
  }
)

上面的操作将对mostRecentTitle数组进行切片,使其具有最近的三个标题。阅读此集合以获得您想要的结果。