在Reactivemongo Aggregation Framework中,如何在组函数“Max”中指定多个键?

时间:2016-11-15 10:40:35

标签: mongodb scala reactivemongo play-reactivemongo

这是示例数据(expireDate是可选的):

{"userId":"1","appId":"1","createdDate":10}
{"userId":"1","appId":"1","createdDate":5,"expireDate":30}
{"userId":"1","appId":"1","createdDate":12,"expireDate":20}
{"userId":"1","appId":"1","createdDate":12,"expireDate":5}

这是我想要转换为reactivemongo聚合框架的聚合函数:

db.collection_name.aggregate([
{
    $match : {"userId" : "1"} 
},
{
    $group : {
        "_id" : "$appId",
        "docs" : { 
            $max : { 
                "createdDate" : "$createdDate",
                "expireDate" : "$expireDate"
            }
        } 
    }
}
])

要对样本数据运行聚合函数(使用mongo shell 3.2.9),结果为:

{ "_id" : "1", "docs" : { "createdDate" : 12, "expireDate" : 20 } }

当我尝试将此聚合函数转换为reactivemongo时,我意识到组函数“Max”只接受一个字符串作为参数,因此我不知道如何将“createdDate”和“expireDate”都放在其中。以下是我到目前为止所得到的:

col.aggregate(
  Match(BSONDocument("userId" -> "1")),
  List(Group(BSONString("$appId"))( "docs" -> Max("createdDate")))
)

有人可以告诉我如何将“expireDate”添加到“Max”功能中吗? 请注意,我使用 reactivemongo 0.11 ,并且无法升级到0.12。

1 个答案:

答案 0 :(得分:1)

您可以使用reactivemongo.api.commands.AggregationFramework.GroupFunction.apply创建对群组功能的自定义调用。 Here is the dochere is the source where I found it

GroupFunction("$max", BSONDocument("createdDate" -> "$createdDate", "expireDate" -> "$expireDate"))

使用此功能代替Max,因此您的代码变为:

col.aggregate(
  Match(BSONDocument("userId" -> "1")),
  List(Group(BSONString("$appId"))( "docs" -> GroupFunction("$max", BSONDocument("createdDate" -> "$createdDate", "expireDate" -> "$expireDate"))))
)

不要忘记导入col.BatchCommands.AggregationFramework.GroupFunction

当然,如果你愿意,你可以定义一个更通用的函数,它将BSONDocument作为参数:

def BetterMax(doc: BSONDocument) = GroupFunction("$max", doc)