MongoDB:按其他集合的总和对记录进行排序

时间:2019-06-30 12:49:07

标签: mongodb sorting collections aggregation-framework

我有两个集合userstasks,我想按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。我被困住了,需要一些帮助。

1 个答案:

答案 0 :(得分:1)

最简单的方法:

  {
    $addFields: {
        temp_id: {$toString: "$_id"}
    }
  },
  {
    $lookup: {
      from: 'tasks',
      localField: 'temp_id',
      foreignField: 'userId',
      as: 'tasks'
    }
  },
  {
    $addFields: {
         totalTasks: {$size: "$tasks"}
     }
  },
  {
    $sort: { totalTasks: -1 }
  }

只要比例不是太大,就可以了。