我有mongo
类型的文档 -
{
"_id" : ObjectId("77f02ee61df85c423b6a4e79"),
"client" : "1"
"type" : "type1",
"hierarchy" : "hier1",
"creationDate" : ISODate("2015-09-09T13:06:44Z"),
"model" : "m1"
},
{
"_id" : ObjectId("77f02ee61df85c423b6a4e80"),
"client" : "1"
"type" : "type1",
"hierarchy" : "hier1",
"creationDate" : ISODate("2015-09-10T14:06:44Z"),
"model" : "m2"
},
{
"_id" : ObjectId("77f02ee61df85c423b6a4e81"),
"client" : "1"
"type" : "type1",
"hierarchy" : "hier2",
"creationDate" : ISODate("2015-09-10T13:06:44Z"),
"model" : "m3"
},
{
"_id" : ObjectId("77f02ee61df85c423b6a4e82"),
"client" : "2"
"type" : "type2",
"hierarchy" : "hier2",
"creationDate" : ISODate("2015-09-10T14:06:44Z"),
"model" : "m4"
}
我想回答查询 - 对于给定的client
,请为每个creationDate
和type
组合(类型+层次结构)获取所有最新(hierarchy
)个文档)。
例如。 client = 1
的上述数据集的输出看起来像
{
"_id" : ObjectId("77f02ee61df85c423b6a4e80"),
"client" : "1"
"type" : "type1",
"hierarchy" : "hier1",
"creationDate" : ISODate("2015-09-10T14:06:44Z"),
"model" : "m2"
},
{
"_id" : ObjectId("77f02ee61df85c423b6a4e81"),
"client" : "1"
"type" : "type1",
"hierarchy" : "hier2",
"creationDate" : ISODate("2015-09-10T13:06:44Z"),
"model" : "m3"
}
我尝试使用给定的流/管道创建查询 -
Match
client = 1
(聚合内$match
)的文档。group
by“list”和“hierarchy”(聚合内的$group
)。 creationDate
字段汇总上一步中的文档组。我实际上希望每个组中包含最新($sum, $avg etc)
字段的文档,而不是应用聚合函数creationDate
但是我被困在流程中的第3点。我不知道如何使用相同的type
和hierarchy
汇总文档,并为单个creationDate
中的每种类型和层次结构选择具有最新日期(mongo
)的文档查询。
答案 0 :(得分:3)
利用$first
阶段内的$group
运算符。然后,如果有必要,请包括$project
阶段。使用$$ROOT
变量将整个字段保存在名为record
的变量下。
示例代码:
db.t.aggregate([
{$match:{"client":"1"}},
{$sort:{"creationDate":-1}},
{$group:{"_id":{"type":"$type",
"hierarchy":"$hierarchy"},
"record":{$first:"$$ROOT"}}}
])
添加如下所示的$project
阶段,将文档字段放在顶层,没有必要,可以在客户端轻松处理。
{$project:{"_id":0,"client":"$record.client","model":"$record.model",..}}