Добавить вычисляемое поле к каждому элементу массива, используя другое поле в качестве значения - PullRequest
0 голосов
/ 25 октября 2018

Структура:

"entity": [
    {
        "_id": {
            "$oid": "5bbf6e6d69a634eeb5a32a0e"
        },
        "Extension Id": "PR00027173",
        "Files": [
            {
                "Locale": "en_WW",
                "FileExtension": "ai",
                "Number": []
            },
            {
                "Locale": "sv_SE",
                "Type": "Technical drawing",
                "FileExtension": "eps",
                "Number": []
            }
        ]
    },
    {
        "_id": {
            "$oid": "5bbf6e6d69a634eeb5a32b7c"
        },
        "Extension Id": "PR00027174",
        "Files": [
            {
                "Locale": "en_WW",
                "FileExtension": "ai",
                "Number": []
            },
            {
                "Locale": "sv_SE",
                "Type": "Technical drawing",
                "FileExtension": "eps",
                "Number": []
            }
        ]
    }
]

Я хочу добавить вычисляемое поле (Число) в каждый элемент массива в поле «Мои файлы» и установить его значение в качестве другого поля из того же элемента, то есть «Тип».Я пробовал это с использованием агрегатной структуры, но каждый раз, когда я устанавливаю значение, он принимает все значения из целого массива, т. Е.один и тот же элемент вместо целого массива?Вот так выглядит моя проекция в совокупности:

  ["projection"]=> array(1) {
["Files.Number"]=>
string(29) "$Files.FileExtension"}}

1 Ответ

0 голосов
/ 25 октября 2018

Это невозможно при стандартной проекции, так как это массив.Вы должны использовать оператор массива $map для установки элементов массива.

Что-то вроде

db.collection.aggregate([
  ...other stages..
  {"$addFields":{
      "Files":{
        "$map":{
         "input":"$Files",
         "in":{
             "Locale": "$$this.Locale",
             "FileExtension": "$$this.FileExtension",
             "Number":"$$this.FileExtension"
          }
        }
      }
   }}
])
...