我有两个集合users
和tasks
,我想按users
集合中创建的任务总和对tasks
进行排序。
用户集合。
users: [
{ _id: ObjectId('1...'), username: 'jack' },
{ _id: ObjectId('2...'), username: 'john' },
{ _id: ObjectId('3...'), username: 'james' }
]
任务集合。
tasks: [
{ _id: ObjectId('...'), userId: '1...', taskName: 'task 1' },
{ _id: ObjectId('...'), userId: '1...', taskName: 'task 2' },
{ _id: ObjectId('...'), userId: '1...', taskName: 'task 3' },
{ _id: ObjectId('...'), userId: '2...', taskName: 'task 1' },
{ _id: ObjectId('...'), userId: '3...', taskName: 'task 1' },
{ _id: ObjectId('...'), userId: '3...', taskName: 'task 2' }
]
这是我到目前为止的去处。
UsersModel.aggregate([
{
$lookup: {
from: 'tasks',
localField: '_id',
foreignField: 'userId',
as: 'tasks'
}
},
{
$group: {
_id: '$_id',
totalTasks: { $sum: '$tasks.userId' }
}
},
{
$sort: { totalTasks: -1 }
}
], (err, res) => {
if (err) console.log(err)
console.log(res)
})
但是我得到这样的结果。
[
{ _id: 1..., totalTasks: 0 },
{ _id: 2..., totalTasks: 0 },
{ _id: 3..., totalTasks: 0 }
]
但这就是我想要的。
[
{ _id: 1..., totalTasks: 3 },
{ _id: 3..., totalTasks: 2 },
{ _id: 2..., totalTasks: 1 }
]
我不确定这是问题所在,但是users._id
的类型为ObjectId
,而tasks.userId
的类型为String
。我被困住了,需要一些帮助。
答案 0 :(得分:1)
最简单的方法:
{
$addFields: {
temp_id: {$toString: "$_id"}
}
},
{
$lookup: {
from: 'tasks',
localField: 'temp_id',
foreignField: 'userId',
as: 'tasks'
}
},
{
$addFields: {
totalTasks: {$size: "$tasks"}
}
},
{
$sort: { totalTasks: -1 }
}
只要比例不是太大,就可以了。