亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

MongoDB - 按內部元素分組

MongoDB - 按內部元素分組

Go
qq_花開花謝_0 2022-10-10 19:31:16
我用一個簡單的例子來解釋,我的 MongoDB 集合看起來像這樣:[    {        pid: erwer,        qty: 3,        LevelDetails: {            level1: { userId: 1, amount: 10 },            level2: { userId: 2, amount: 20 },            level3: { userId: 3, amount: 13 },        }    },    {        pid: qwsdfg,        qty: 1,        LevelDetails: {            level1: { userId: 1, amount: 10 },            level2: { userId: 4, amount: 20 },            level3: { userId: 3, amount: 13 },        }    },]從集合中,我需要每個用戶的級別 1、級別 2 和級別 3 的總和。查詢結果應如下所示:[    { userId1: { TotalLevel1Amount: 20, TotalLevel2Amount: 0, TotalLevel3Amount: 0 } },    { userId2: { TotalLevel1Amount: 0, TotalLevel2Amount: 20, TotalLevel3Amount: 0 } },    { userId3: { TotalLevel1Amount: 0, TotalLevel2Amount: 0, TotalLevel3Amount: 26 } },    { userId4: { TotalLevel1Amount: 0, TotalLevel2Amount: 20, TotalLevel3Amount: 0 } }]
查看完整描述

1 回答

?
汪汪一只貓

TA貢獻1898條經驗 獲得超8個贊

  1. $set_levelDetails:通過轉換LevelDetails為鍵值對來添加新字段。

  2. $unwind: 解構_levelDetails數組。

  3. $group: 分組_levelDetails.v.userId$sum有條件地基于級別 ( _levelDetails.k)。

  4. $project: 格式化顯示的文件。

  5. $sort(可選):按userID升序排序。

db.collection.aggregate([

  {

    $set: {

      _levelDetails: {

        $objectToArray: "$LevelDetails"

      }

    }

  },

  {

    $unwind: "$_levelDetails"

  },

  {

    $group: {

      _id: "$_levelDetails.v.userId",

      "TotalLevel1Amount": {

        $sum: {

          $cond: [

            {

              "$eq": [

                "$_levelDetails.k",

                "level1"

              ]

            },

            "$_levelDetails.v.amount",

            0

          ]

        }

      },

      "TotalLevel2Amount": {

        $sum: {

          $cond: [

            {

              "$eq": [

                "$_levelDetails.k",

                "level2"

              ]

            },

            "$_levelDetails.v.amount",

            0

          ]

        }

      },

      "TotalLevel3Amount": {

        $sum: {

          $cond: [

            {

              "$eq": [

                "$_levelDetails.k",

                "level3"

              ]

            },

            "$_levelDetails.v.amount",

            0

          ]

        }

      }

    }

  },

  {

    $project: {

      _id: 0,

      userId: "$_id",

      TotalLevel1Amount: 1,

      TotalLevel2Amount: 1,

      TotalLevel3Amount: 1

    }

  },

  {

    $sort: {

      userId: 1

    }

  }

])

示例 Mongo Playground


對于鍵值對:{ 'userId': { // Result } }

步驟 1 到 3 與前面的解決方案相同。

  1. $sort(可選):按_id升序排序。

  2. $project:顯示帶有array字段的文檔(帶有屬性kv)。

  3. $replaceRoot:將整個文檔替換為鍵(userId)和值(結果)。

db.collection.aggregate([

  {

    $set: {

      _levelDetails: {

        $objectToArray: "$LevelDetails"

      }

    }

  },

  {

    $unwind: "$_levelDetails"

  },

  {

    $group: {

      _id: "$_levelDetails.v.userId",

      "TotalLevel1Amount": {

        $sum: {

          $cond: [

            {

              "$eq": [

                "$_levelDetails.k",

                "level1"

              ]

            },

            "$_levelDetails.v.amount",

            0

          ]

        }

      },

      "TotalLevel2Amount": {

        $sum: {

          $cond: [

            {

              "$eq": [

                "$_levelDetails.k",

                "level2"

              ]

            },

            "$_levelDetails.v.amount",

            0

          ]

        }

      },

      "TotalLevel3Amount": {

        $sum: {

          $cond: [

            {

              "$eq": [

                "$_levelDetails.k",

                "level3"

              ]

            },

            "$_levelDetails.v.amount",

            0

          ]

        }

      }

    }

  },

  {

    $sort: {

      _id: 1

    }

  },

  {

    $project: {

      array: [

        {

          k: {

            $toString: "$_id"

          },

          v: {

            TotalLevel1Amount: "$TotalLevel1Amount",

            TotalLevel2Amount: "$TotalLevel2Amount",

            TotalLevel3Amount: "$TotalLevel3Amount"

          }

        }

      ]

    }

  },

  {

    "$replaceRoot": {

      newRoot: {

        $arrayToObject: "$array"

      }

    }

  }

])

示例 Mongo Playground(到鍵值對)


查看完整回答
反對 回復 2022-10-10
  • 1 回答
  • 0 關注
  • 183 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號