2015-08-28 67 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