簡體   English   中英

基於另一個集合上的字段對文檔進行分組 Mongodb

[英]Group documents based on field on another collection Mongodb

我有 3 個 collections

測驗

[
  {
    "_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
}

您可以在answers集合上使用聚合管道來獲得所需的結果。

  1. $lookup階段開始,為answers集合中的每個文檔獲取測驗標簽。
  2. 使用$unwind階段為每個測驗文檔返回 output 文檔。
  3. 引入一個$group階段,通過relatedUserquiz.tags字段對文檔進行分組,並使用$sum計算result的總和。
  4. 添加另一個$lookup階段以從users集合中獲取用戶文檔。
  5. 使用另一個$unwind階段為每個用戶文檔返回 output 文檔。
  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游樂場

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM