首页 > 解决方案 > 基于另一个集合 Mongodb 上的字段对文档进行分组

问题描述

我有 3 个收藏

测验

[
  {
    "_id": 1,
    "name": "quiz1",
    "tags": "tag1",
  },
  {
    "_id": 2,
    "name": "quiz2",
    "tags": "tag1"
  }
]

用户

{
   "_id": 1,
   "name": "Mike"
}

答案

[
  {
   _id: 1,
   "relatedUser": 1,
   "relatedQuiz": 1,
   "result": 10
  },
  {
    _id: 1,
    "relatedUser": 1,
    "relatedQuiz": 2,
    "result": 20
  }
]

并且需要 Result 是

{
   "tags": "tag1",
   "relatedUser": "Mike",
   "totalResult": 30
}

标签: mongodb

解决方案


您可以在集合上使用聚合管道answers来获得所需的结果。

  1. 从一个阶段开始,为集合$lookup中的每个文档获取测验标签。answers
  2. 使用$unwind阶段为每个测验文档返回一个输出文档。
  3. 引入一个$group阶段来按relatedUserquiz.tags字段对文档进行分组并计算resultusing的总和$sum
  4. 添加另一个$lookup 阶段以从users集合中获取用户文档。
  5. 使用另一个$unwind阶段为每个用户文档返回一个输出文档。
  6. 完成一个$project阶段以返回您感兴趣的字段。
db.answers.aggregate([
  {
    $lookup: {
      from: 'quizzes',
      localField: 'relatedQuiz',
      foreignField: '_id',
      as: 'quiz',
    },
  },
  {
    $unwind: '$quiz',
  },
  {
    $group: {
      _id: {
        userId: '$relatedUser',
        tags: '$quiz.tags',
      },
      score: {
        $sum: '$result',
      },
    },
  },
  {
    $lookup: {
      from: 'users',
      localField: '_id.userId',
      foreignField: '_id',
      as: 'user',
    },
  },
  {
    $unwind: '$user',
  },
  {
    $project: {
      _id: 0,
      tags: '$_id.tags',
      relatedUser: '$user.name',
      totalResult: '$score',
    },
  },
])

Mongo游乐场


推荐阅读