Можно ли использовать значение вложенного документа массива в выражении при агрегации mongodb? - PullRequest
0 голосов
/ 18 октября 2019

Допустим, у меня есть этот документ:

{
  _id: 0,
  array: [{a: 120}, {a: 2452}]
}

И я хочу получить:

{
  _id: 0,
  array: [{a: 120}, {a: 2452}],
  a1x2: 240 // array[0].a * 2
}

В настоящее время самый простой способ сделать это в агрегации,is:

db.collection.aggregate([{
  $match: {}
}, {
  $set: {aTmp: {$arrayElemAt: ["$array", 0]}}
}, {
  $project: {
    array: 1,
    a1x2: {$multiply: ["$aTmp.a", 2]},
    aTmp: 0
  }
}

Есть ли способ сделать это без промежуточного шага установки aTmp? Я не знаю, как получить значение вложенного документа для ключа, когда оно имеет форму {$arrayElemAt: ["$array", 0]}.

Я также пытался использовать $array.0.a и $array[0].a, но безрезультатно.

1 Ответ

1 голос
/ 18 октября 2019

Вы можете использовать $ let :

db.collection.aggregate([
  { $addFields: {
      a1x2: { $let: {
          vars: {
            aTmp: {$arrayElemAt: ["$array", 0]}
          },
          in: {$multiply: ["$$aTmp.a", 2]}
      }}
  } }
])
...