Как сопоставить значения, которые присутствуют внутри массива, с полем в монго - PullRequest
0 голосов
/ 05 марта 2019

У меня есть эти данные в монго

{
  _id: {
    question_id: 3
  },
  data: {
    answer: 11,
    count: 114,
    result: [
      {
        _id: 3,
        question: "What is your age group?",
        options: [
          {
            id: 10,
            option: "<18"
          },
          {
            id: 11,
            option: "18-24"
          },
          {
            id: 12,
            option: "24-35"
          },
          {
            id: 13,
            option: ">35"
          }
        ],
        type: "Radio"
      }
    ]
  }
},

Здесь я хотел бы выполнить проверку equals to между answer и result.options.id, и, если значение соответствует, оно должно вернуть result.options.option

Так что желаемый результат будет

{
  _id: {
    question_id: 3
  },
  data: {
    answer:'18-24',
    count: 114,
    
  }
},

Пока я пробовал это

'$project'=>[
  'res'=>[
    '$map'=>[
      'input'=>'$data.result.options',
      'as'=>'dt',
      'in'=>[
        '$cond'=>[
          'if'=>[
            '$eq'=>[
              '$$dt.id',
              '$data.answer'
            ]
          ],
          'then'=>'$$dt.option',
          'else'=>'$$dt.id'
        ]
      ]
    ]
  ]
]

Любая подсказка относительно того, что я делаю неправильно.Мой код всегда возвращает оператор else

1 Ответ

0 голосов
/ 05 марта 2019

Вы были близки, но есть пара не совсем правильных вещей:

[ '$project'=> [
  'data' => [
    'answer' => [
      '$let' => [
        'vars' => [
          'res' => [
            '$reduce' => [
              'input' => '$data.result.options',
              'initialValue' => [],
              'in' => [ '$concatArrays': [ '$$value', '$$this' ] ]
            ]
          ]
        ],
        'in' => [
          '$arrayElemAt' => [
            '$$res.option',
            [ '$indexOfArray': [ '$$res.id', '$data.answer' ] ]
          ]
        ]
      ]
    ],
    'count' => '$data.count'
  ]
]]

Путь к '$data.result.options' фактически находится во вложенных массивах, поэтому для того, чтобы любые "операции над массивами" работаливо внутреннем значении 'options' вам нужно "сплющить" эту структуру массива в единый массив.

Для этого вы должны использовать $reduce вместе с $concatArrays.Это также продемонстрировано в блоке $let, так как вы хотите использовать этот «массив результатов» в некоторых последующих операциях.

Это самый простой способизвлечь одно значение - найти соответствующий индекс массива через $indexOfArray до 'data.answer', а затем извлечь значение 'option' из вашего "массива результатов" , обработанного ранеедля этого значения, используя $arrayElemAt, конечно, указывая на этот соответствующий "индекс".

Оператор $indexOfArray надежен здесь, пока вы всегда будете иметьответ, соответствующий значению 'data.answer', присутствующему в массиве документов.

...