我搜索了类似的问题,但找不到任何东西。随意指点我的方向。
说我有这样的数据:
{ "_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“从最新版本中获取所有值”。
前面未知的字段名称是MongoDB中的一种反模式,它会导致各种无法解决的问题,应尽可能避免。 – Philipp
他们不完全是任意的,只是我有一个可以属于两个类别之一的项目集合。就像包含卡车和汽车的“车辆”系列一样。我是否应该重新组织它,以便所有字段在集合中的所有记录中都完全相同? – slouc
MongoDB的无模式特性允许您拥有只存在于特定类型文档中的“可选”字段,但是当您在不同类型中具有相同意义的字段时,它们应该具有相同的名称。否则,你会遇到这个(和其他许多问题)。 – Philipp