【问题标题】:MongoDB: Sorting records by the sum of other collection [duplicate]MongoDB:按其他集合的总和对记录进行排序[重复]
【发布时间】:2019-11-11 11:29:20
【问题描述】:

我有两个集合 userstasks,我想按照它们在 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 的类型是ObjectIdtasks.userId 的类型是String。我被困住了,需要一些帮助。

【问题讨论】:

  • 你能转换typetasks.userId 吗?你使用的是什么版本的 mongodb?
  • @Ashh 你的意思是代码是正确的,但除非我将tasks.userId 的类型转换为ObjectId,否则它将不起作用?我正在使用v4.0.3

标签: mongodb sorting collections aggregation-framework


【解决方案1】:

最简单的方法:

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

只要你的规模不是太大,这种方式就可以了。

【讨论】:

  • 这仅在users._idtasks.userId 具有相同的数据类型ObjectId 时才有效。但我的users._idObjectIdtasks.userIdString。所以在这种情况下它不起作用。我认为我们需要一种方法来转换此查询中的数据类型。
  • 如果您在 mongo 4.0+ 上,您可以在查找之前使用 $toString 将您的 objectId 转换为字符串。否则你必须在代码中完成。
  • 如果不是太多,你能给我一个示例代码吗?我想不出在$lookup 之前实现$toString
  • 我编辑了我的答案,你只需添加一个 $addFields 阶段。
  • 非常感谢它现在正在工作。我将其标记为已接受的答案。
猜你喜欢
  • 2013-03-29
  • 2019-08-04
  • 2012-11-07
  • 1970-01-01
  • 2010-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多