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美元)。