我在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 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语句
答案 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'
值匹配的答案即可。