2016-01-20 78 views
1

我搜索了类似的问题,但找不到任何东西。随意指点我的方向。

说我有这样的数据:

{ "_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排序,这样每个组中只剩下最新的记录,这就是我可以实现的目标。但我需要一种方法来避免命名结果中所需的所有字段(在本示例中为“名称”),因为在我的实际使用情况下,它们未知。

那么,有没有办法做到这一点,但没有必要明确命名每个字段使用$last,只是采取所有领域呢?当然,我会在分组之前对数据进行分类,我只需要告诉Mongo“从最新版本中获取所有值”。

+1

前面未知的字段名称是MongoDB中的一种反模式,它会导致各种无法解决的问题,应尽可能避免。 – Philipp

+0

他们不完全是任意的,只是我有一个可以属于两个类别之一的项目集合。就像包含卡车和汽车的“车辆”系列一样。我是否应该重新组织它,以便所有字段在集合中的所有记录中都完全相同? – slouc

+0

MongoDB的无模式特性允许您拥有只存在于特定类型文档中的“可选”字段,但是当您在不同类型中具有相同意义的字段时,它们应该具有相同的名称。否则,你会遇到这个(和其他许多问题)。 – Philipp

回答

1

看到一些可能的选项here

  • 做多的发现()排序()为每个 要搜索的ATTR值的查询。
  • 获取$ last文档的原始_id,然后为每个值(这是更具扩展性的选项)执行findOne()。
  • 使用$$ROOT系统变量,如here所示。

这不会是最快的操作,但我假设您使用这更多的分析,而不是响应用户的行为。

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

+0

我不知道$$ ROOT,这对我有帮助。其他人的示例:db.content.aggregate({$ group:{_id:'$ attr',lastItem:{$ last:“$$ ROOT”}}})。请注意,如果您使用的是ReactiveMongo(与我一样),则只需使用一个美元符号。 – slouc

相关问题