我搜索了類似的問題,但找不到任何東西。隨意指點我的方向。
說我有這樣的數據:
{ "_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