2015-10-16 51 views
1

我想提取整個文檔分組。找到所有的文件,這是一個字段的最新由mongodb集合中的另一個字段截然不同

作爲一個例子,我有一個名爲「sub_comment」的集合。

每個「sub_comment」都有一個「comment」作爲「commentId」。

sub_comment = new Schema({ // as per mongoose schema 
    updatedAt : Date, 
    text : String, 
    by : String, 
    info : String, 
    commentId : { type : ObjectId, ref : 'commment' } 
}) 

現在我想提取所有那些最新的(由「updatedAt」的手段)的每個評論分組subcomments(完整的文檔)。

我目前這樣做:

mongoose.model('sub_comment').aggregate([ 
      { $sort: { commentId : 1, updatedAt: -1 } }, 
      { $group: { _id: "$commentId", updatedAt: { $first: "$updatedAt" } } } 
      ] 

這當然,只返回兩個字段是updatedAtcommentId

現在如果我想要整個文檔。我將不得不單獨編寫每個領域,我不想這樣做。

什麼應該是首選方法?

編輯:簡單的查詢

集合=

[ 
{commentId : 1, updatedAt : ISO("2015-10-13T11:38:29.000Z"), xyz : 'xyz1' }, 
{commentId : 2, updatedAt : ISO("2015-10-10T11:38:29.000Z"), xyz : 'xyz2' }, 
{commentId : 2, updatedAt : ISO("2015-10-14T11:38:29.000Z"), xyz : 'xyz3' }, 
{commentId : 1, updatedAt : ISO("2015-10-11T11:38:29.000Z"), xyz : 'xyz4' } 
] 

我想輸出:

[ 
{commentId : 1, updatedAt : ISO("2015-10-13T11:38:29.000Z"), 'xyz' : 'xyz1' }, 
{commentId : 2, updatedAt : ISO("2015-10-14T11:38:29.000Z"), 'xyz' : 'xyz3' } 
] 

回答

1

可以使用$$ROOT系統變量的集合指完整的頂處於該階段的高層級文檔:

mongoose.model('sub_comment').aggregate([ 
     { $sort: { commentId : 1, updatedAt: -1 } }, 
     { $group: { _id: "$commentId", doc: { $first: "$$ROOT" } } } 
     ] 
+0

MongoError:例外:FieldPath字段名稱可能不以'$'開頭 – codeofnode

+0

在MongoDB 2.6中添加了$$ ROOT,因此請確保您的服務器處於該版本或更高版本。 – JohnnyHK

+0

確定我的是2.4.5,但是在遷移mongo之後,你確定,我不會得到這樣的錯誤:[MongoError:異常:組合字段'doc'必須被定義爲對象內的表達式]? ?? – codeofnode

相關問題