MongoDB Spring数据,具有复杂条件的最大聚合

时间:2015-08-28 05:00:00

标签: java spring mongodb spring-data

我使用mongodb作为面向文档的数据库,并将数据作为ODM弹出数据。我正面临困难时期,在复杂的bson结构上执行最大聚合。 我必须从所有文档中找到最大日期,但如果文档有嵌入文档,则必须考虑最大日期的嵌入文档。 这是一个例子,假设我有一个集合名称person和person集合包含以下文档。

{
     "_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 个答案:

答案 0 :(得分: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"}
    }},    

])