在Mongo Aggregation Pipeline上使用$ last

时间:2016-01-20 14:14:39

标签: mongodb mongodb-query aggregation-framework

我搜索了类似的问题,却找不到任何问题。请随意指出我的方向。

说我有这些数据:

{ "_id" : ObjectId("5694c9eed4c65e923780f28e"), "name" : "foo1", "attr" : "foo" }
{ "_id" : ObjectId("5694ca3ad4c65e923780f290"), "name" : "foo2", "attr" : "foo" }
{ "_id" : ObjectId("5694ca47d4c65e923780f294"), "name" : "bar1", "attr" : "bar" }
{ "_id" : ObjectId("5694ca53d4c65e923780f296"), "name" : "bar2", "attr" : "bar" }

如果我想获取每个属性组的最新记录,我可以这样做:

> db.content.aggregate({$group: {_id: '$attr', name: {$last: '$name'}}})
{ "_id" : "bar", "name" : "bar2" }
{ "_id" : "foo", "name" : "foo2" }

我希望我的数据按attr分组,然后按_id排序,以便每组中只保留最新记录,这就是我如何实现这一目标。但我需要一种方法来避免在结果中命名我想要的所有字段(在本例中为“name”),因为在我的实际用例中,它们是未知的。

那么,有没有办法实现这一点,但无需使用$last明确命名每个字段,而只是取代所有字段?当然,我会在分组之前对数据进行排序,我只需要以某种方式告诉Mongo“从最新值中获取所有值”。

1 个答案:

答案 0 :(得分:1)

查看一些可能的选项here

  • 对每个attr值执行多个find()。sort()查询 想要搜索。
  • 抓取$ last doc的原始_id,然后为每个值执行findOne()(这是更具扩展性的选项)。
  • 使用$$ROOT所示的here系统变量。

这不是最快的操作,但我认为你更多地使用它来进行分析,而不是回应用户行为。

编辑添加评论中发布的slouc示例: db.content.aggregate({$group: {_id: '$attr', lastItem: { $last: "$$ROOT" }}})