Выберите поле документа во вложенном массиве, используя агрегацию - PullRequest
1 голос
/ 31 января 2020

У меня есть следующий документ:

{
    "options": [
        {
            "cost": 5,
            "value": {
                "en": "Socket, where I can plug in my own cable",
                "fr": "Prise, où je peux brancher mon propre câble"
            }
        },
        {
            "cost" 15,
            "value": {
                "en": "Fixed cable",
                "fr": "Câble fixe"
            }          
        }
    ]
}

И я хочу получить в качестве значения значение en, ​​что-то вроде этого:

{
    "options": [
        {
            "cost": 5,
            "value": "Socket, where I can plug in my own cable"
        },
        {
            "cost" 15,
            "value": "Fixed cable"       
        }
    ]
}

Я уже пробовал с $addFields и как поле для доступа с $options.value.en или с вложенностью. Я пробовал также с $map, но безрезультатно.

Я не хочу $unwind опций и группировать их после $addFields;

Ответы [ 2 ]

1 голос
/ 31 января 2020

Вы можете использовать ниже агрегации

db.collection.aggregate([
  { "$addFields": {
    "options": {
      "$map": {
        "input": "$options",
        "in": {
          "cost": "$$this.cost",
          "value": "$$this.value.en"
        }
      }
    }
  }}
])
0 голосов
/ 31 января 2020

Попробуйте это:

db.collection.aggregate([
  {
    $unwind: {
      path: "$options"
    }
  },
  {
    $project: {
      "options.cost": 1,
      "options.value": "$options.value.en"
    }
  },
  {
    $group: {
      _id: 0,
      options: {
        $push: "$options"
      }
    }
  }
])
...