首页 > 解决方案 > 具有动态字段名称的 mongo 组查询

问题描述

我正在尝试为两个级别的分组结果创建一个 mongoquery。首先按文件夹,然后按名称。

收藏:

    [
  {
    folder: "A",
    name: "Apple",
    color: "red"
  },
  {
    folder: "A",
    name: "Banana",
    color: "green"
  },
  {
    folder: "A",
    name: "Apple",
    color: "yellow"
  },
  {
    folder: "B",
    name: "Cherry",
    color: "green"
  }
]

预期结果:

  {
    A:{
        Apple:[item1, item3]
        Banana:[item2]
    },
    B:{
        Cherry:[item4]
    },
}

我已经有一个接近的结果,但问题是我无法输入动态字段名称,我的查询:

    db.collection.aggregate([
  {
    $group: {
      _id: {
        folder: "$folder",
        name: "$name"
      },
      files: {
        $push: "$$ROOT"
      },
      
    },
    
  },
  {
    "$group": {
      "_id": "$_id.name",
      "files": {
        $push: {
          "{ThisMustBeTheName}": "$files"
        }
      },
      
    }
  }
])

https://mongoplayground.net/p/Bq1qYZN7j4v

任何想法或建议?

标签: mongodb

解决方案


db.collection.aggregate([
  {
    $group: {
      _id: {
        folder: "$folder",
        name: "$name"
      },
      files: {
        $push: "$$ROOT"
      },
      
    },
    
  },
  {
    "$group": {
      "_id": "$_id.name",
      "files": { //To make replace root syntax correct
        $push: {
          "k": "$_id.name",
          "v": "$files"
        }
      }
    }
  },
  {
    "$replaceRoot": { //It does the dynamic naming part
      "newRoot": {
        "$mergeObjects": [
          {
            "$arrayToObject": "$files"
          }
        ]
      }
    }
  }
])

另一个更新:

db.collection.aggregate([
  {
    $group: {
      _id: {
        folder: "$folder",
        name: "$name"
      },
      files: {
        $push: "$$ROOT"
      },
      
    },
    
  },
  {
    "$group": {
      "_id": "$_id.name",
      "files": {
        $push: {
          "k": "$_id.name",
          "v": "$files"
        }
      },
      "folder": {
        $first: "$files.folder"
      }
    }
  },
  {
    "$replaceRoot": {
      "newRoot": {
        "$mergeObjects": [
          {
            "$arrayToObject": "$files"
          },
          {
            "folder": {
              $first: "$folder"
            }
          }
        ]
      }
    }
  },
  {
    "$group": {
      "_id": "$folder",
      "data": {
        "$push": "$$ROOT"
      }
    }
  },
  {
    $group: {
      "_id": "$_id",
      "d": {
        $push: {
          "k": "$_id",
          "v": "$data"
        }
      }
    }
  },
  {
    "$replaceRoot": {
      "newRoot": {
        "$mergeObjects": [
          {
            "$arrayToObject": "$d"
          }
        ]
      }
    }
  }
])

推荐阅读