2015-08-28 86 views
0

我使用mongodb作爲面向文檔的數據庫,並將spring數據作爲ODM使用它。我面臨困難時期,在複雜的bson結構上執行最大的聚合。 我必須從所有文檔中找到最大日期,但如果文檔具有嵌入文檔,則必須考慮嵌入文檔的最大日期。 這裏是一個例子,讓我們假設我有一個集合名稱person和person集合包含以下文檔。MongoDB Spring數據,具有複雜條件的最大聚合

{ 
    "_id" : ObjectId("55def1ceb5b5ed74ddf2b5ce"), 
    "name" : "abc", 
    "birth_date_time" : '15 June 1988' 
     "children" : { 
     "_id" : ObjectId("55def1ceb2223ed74ddf2b5ce"), 
     "name" : "def", 
     "birth_date_time" : '10 April 2010' 
     } 
}, 
{ 
    "_id" : ObjectId("55def1ceb5b5ed74dd232323"), 
    "name" : "xyz", 
    "birth_date_time" : '15 June 1986' 
}, 
{ 
    "_id" : ObjectId("55def1ceb5b5ed74ddf2b5ce"), 
    "name" : "mno", 
    "birth_date_time" : '18 March 1982' 
     "children" : { 
     "_id" : ObjectId("534ef1ceb2223ed74ddf2b5ce"), 
     "name" : "pqr", 
     "birth_date_time" : '10 April 2009' 
     } 
} 

它應該返回2010年4月10日,因爲這是一個人在收集人的最大出生日期。我想知道使用spring數據存儲庫來實現它的人員。

回答

1

這裏是MongoDB聚合。他們應該很容易在Spring Data中實現。

db.person.aggregate([ 
    {$group: { 
     _id: null, 
     maxDate: {$max : { 
      $cond: [ 
       {$gt : ["$birth_date_time","$children.birth_date_time"]}, 
       "$birth_date_time", 
       "$children.birth_date_time" 
      ]}} 
    }} 
]) 

或使用$project

db.person.aggregate([{ 
    $project: { 
     mDate: { 
      $cond: [ 
       {$gt : ["$birth_date_time","$children.birth_date_time"]}, 
       "$birth_date_time", 
       "$children.birth_date_time" 
      ] 
     } 
    }}, 
    {$group: { 
     _id: null, 
     maxDate: {$max : "$mDate"} 
    }},  

]) 
+0

謝謝FO答案......我不想用mongoTemplete這將是對豆額外注射這種特殊情況下? @MirceaG是否有任何方式使用Query註釋將此聚合查詢與Spring數據存儲庫接口進行映射? –

+0

對不起,我不熟悉'@ Query'的功能。我通常在Spring操作(如$ redact)不支持Spring時使用Spring Data Aggregation Builder或Mongo Java Driver'DBCollection.aggregate' – MirceaG