2016-01-20 79 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

相關問題