MongoDB聚合最后一项匹配条件

MongoDB聚合最后一项匹配条件,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我想得到一个列的最后一个值,该值符合某些条件。如果我使用$last和$cond,它几乎总是会给我$cond的第三个参数 我有以下记录 {uid:1,subject:"Maths",name:"Assignment 1",s_date:"2017-01-15 00:00:00"} {uid:1,subject:"Maths",name:"Assignment 2",s_date:"2017-01-17 00:00:00"} {uid:2,subject:"Maths",name:"Assignme

我想得到一个列的最后一个值,该值符合某些条件。如果我使用
$last
$cond
,它几乎总是会给我
$cond
的第三个参数

我有以下记录

{uid:1,subject:"Maths",name:"Assignment 1",s_date:"2017-01-15 00:00:00"}
{uid:1,subject:"Maths",name:"Assignment 2",s_date:"2017-01-17 00:00:00"}
{uid:2,subject:"Maths",name:"Assignment 1",s_date:"2017-01-16 00:00:00"}
{uid:1,subject:"Science",name:"Assignment 1",s_date:"2017-01-11 00:00:00"}
我想对这些项目进行分组,找出每个科目最后一次作业提交的日期。我想做的是

collection.aggregate(
    {
        $group: {
        _id: '$uid',
        science: { 
            $last: {
                $cond: [
                    { $eq: ['$subject','Science'] },
                    '$u_date',
                    null
                ]
            }
        }
    }
)
在这种情况下,如果用户的最后一条记录没有主题为“Science”,那么我将始终得到null作为输出

(我知道这可以通过使用
\u id:{'uid':'uid','subject':'subject'}进行分组来实现。
这是一个假设的示例。我的实际记录集稍微复杂一些

请理解,我不希望最终输出为

{_id:{uid:1,subject:"Science"},'s_date':'2017-01-11 00:00:00'} 
格式,但在

{_id:1,science:'2017-01-11 00:00:00',maths:'2017-01-14 00:00:00'} 
格式)


请帮我另找一条路。我曾想过使用
$filter
$setDifference
,但由于记录集很大,而且查询是由系统动态生成的,因此这会使它变得更复杂。

您可以使用$group两次

collection.aggregate([
  { $sort: { s_date: -1 } },
  { $group: {
    _id: { uid: '$uid', subject: '$subject' },
    s_date: { $last: '$s_date' },
  } },
  { $group: {
    _id: '$_id.uid',
    s_dates: { $push: { subject: "$_id.subject", s_date: "$s_date" } },
  } },
])
结果:

{
  _id: 1,
  s_dates: [
    { subject: 'Maths', s_date: '2017-01-17 00:00:00' },
    { subject: 'Science', s_date: '2017-01-11 00:00:00' },
  ],
}
{
  _id: 2,
  s_dates: [
    { subject: 'Maths', s_date: '2017-01-16 00:00:00' },
  ],
}

正如我在问题中提到的,我不能使用基于主题的分组,因为有多个字段和基于这些字段的多个条件。这就是为什么我使用$cond而不是直接用uid和subject对它进行分组的主要原因。我不明白你当时想做什么。你能举一个例子说明按uid和subject分组然后按uid分组不起作用吗?例如,我在一个集合中存储用户事件。将有多个事件和与事件关联的不同字段。例如:将有一个用户登录事件,其中登录时间作为一个字段,并且将有一个用户购买事件,用户花费的金额作为字段。我必须编写一个聚合查询,它将获取一周内登录并以超过10美元的价格购买的用户列表。(再次假设)在上述条件下,假设一种情况,我希望获取上次购买特定金额的用户。(比如说1美元)。