Как создать новые имена полей, используя значения из списка объектов в pymongo?

#python #mongodb #mongodb-query #aggregation-framework #pymongo

Вопрос:

Итак, у меня есть записи в базе данных mongo, которые имеют этот формат (просто пример):

 {
    _id: 1,
    name: "some name1",
    description: "some description1",
    parameters: [
        {
            name: "param name1",
            type: "param type1",
            default: "default value1"
        },
        {
            name: "param name2",
            type: "param type2",
            default: "default value2"
        }
    ]
   .
   .
   .
}
 

В своей программе я выполняю эту агрегацию записей:

 {
    '$project': {
        'title': '$name,
        'description': True,
        'parameters': {
            'name': True,
            'parameter_type': '$parameters.type',
            'value': '$parameters.default'
        }
    }
}
 

Результат, который я пытался получить:

 {
    _id: 1,
    title: 'some name1',
    description: "some description1",
    parameters: [ 
        {
            name: "param name1",
            parameter_type: "param type1",
            value: "default value1"
        },
        {
            name: "param name2",
            parameter_type: "param type2",
            value: "default value2"
        }
    ]
 }
 

Вместо этого я получил:

 {
    _id: 1,
    title: 'some name1',
    description: "some description1",
    parameters: [ 
        {
            name: "param name1",
            parameter_type: ["param type1", "param type2"],
            value: ["default value1", "default value2"]
        }
    ]
 }
 

Все, что я пытаюсь сделать, это изменить имена полей для объектов в списке параметров. Я попытался просмотреть документы MongoDB, но не смог найти способ сделать то, что мне нужно.

Комментарии:

1. parameters является массивом, поэтому, если у вас в нем несколько записей, и в вашем конвейере проекта они объединяются вместе, чтобы вернуть вам массив. добавьте свой запрос с данными тестирования здесь mongoplayground.net

2. Да, я понимаю, как это могло бы быть. Мне просто интересно, есть ли способ получить желаемый результат, возможно, с помощью выражения или другой агрегации.

3. По какой логике вы хотите выбрать 1 параметр из списка параметров?, вы хотите 1-й параметр из списка ?

4. По сути, я просто пытаюсь переименовать поля в списке объектов. Поэтому я хочу изменить значение по умолчанию: «значение по умолчанию» на значение: «значение по умолчанию» и тип: «тип параметра», чтобы стать параметром типа: «тип параметра». Поэтому я хочу, чтобы данные в записях оставались прежними, но меняли имена полей. Но поскольку параметры указаны в списке, это все усложняет. Имеет ли это смысл?

5. Извините, примеры, которые я привел, были неточными. Я обновил вопрос, чтобы показать, что я пытался сказать.

Ответ №1:

$unwind Деконструирует поле массива из входных документов и группирует их обратно с требуемой проекцией.

Демо — https://mongoplayground.net/p/-pIPbSarfyx

 db.collection.aggregate([
  {
    "$unwind": "$parameters"
  },
  {
    "$group": {
      "_id": "$_id",
      "name": {
        "$first": "$name"
      },
      "description": {
        "$first": "$description"
      },
      "parameters": {
        "$push": {
          "name": "$parameters.name",
          "parameter_type": "$parameters.type",
          "value": "$parameters.default"
        }
      },
      
    }
  }
])
 

$раскрутите

$группа

$первый

$толчок

Комментарии:

1. Блестяще! Спасибо.