【发布时间】:2019-11-11 11:29:20
【问题描述】:
我有两个集合 users 和 tasks,我想按照它们在 tasks 集合中创建的任务总和对 users 进行排序。
用户集合。
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 }
]
但这正是我要找的。p>
[
{ _id: 1..., totalTasks: 3 },
{ _id: 3..., totalTasks: 2 },
{ _id: 2..., totalTasks: 1 }
]
我不确定这是不是问题,但users._id 的类型是ObjectId,tasks.userId 的类型是String。我被困住了,需要一些帮助。
【问题讨论】:
-
你能转换
type的tasks.userId吗?你使用的是什么版本的 mongodb? -
@Ashh 你的意思是代码是正确的,但除非我将
tasks.userId的类型转换为ObjectId,否则它将不起作用?我正在使用v4.0.3。
标签: mongodb sorting collections aggregation-framework