пн go групповой запрос с динамикой c имя поля - PullRequest
0 голосов
/ 07 августа 2020

Я пытаюсь создать 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]
    },
}

У меня уже есть близкий результат, но проблема в том, что я Не могу указать имя поля c, Мой запрос:

    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

Есть идеи или предложения?

1 Ответ

1 голос
/ 07 августа 2020

играть

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"
          }
        ]
      }
    }
  }
])
...