如何将数组中存在的值与mongo中的字段进行匹配

时间:2019-03-05 09:32:13

标签: php mongodb mongodb-query aggregation-framework

我在mongo中设置了此数据

{
  _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 toanswer之间执行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 :(得分:0)

您很亲近,但有些事情不太正确:

[ '$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'值匹配的答案即可。