如何在 $addFields 阶段(聚合)使用字段值作为数组索引

How to use a field's value as an array index in $addFields stage (aggregation)

我在一个数组中有一个字符串,它位于另一个数组中。我想将另一个字符串连接到已经存在的字符串(位于两个数组的最后一个索引处)。我有文档中存储的最后一个元素的索引

{
  _id: 'id',
  array1: [
    0: [...]
    ...
    m: [
      0: {}
      ...
      n: {id: 'id', string: 'hello'}
    ]
  ],
  i: m,
  j: n
}

我想连接'world!'到 array1[m][n].string 处的字符串,或者换句话说,到 array1[$i][$j].string

我已经尝试了以下阶段,但 none 奏效了。

{ $addFields: { array1.$i.$j.string: <expression> }
{ $addFields: { array1.$[i].$[j].string: <expression> }
{ $addFields: { array1.[$i].[$j].string: <expression> }

数据

{
  _id: 'abc',
  array1: [
    0: {
      id: 'def'
      array2: [
        0: {
          id: '123',
          string: 'hello'
        }
      ]
    }
  ],
  i: 0,
  j: 0,
}

在 运行 管道之后,我想获得相同的结构,但字符串中包含 'hello world'。

{
  _id: 'abc',
  array1: [
    0: {
      id: 'def'
      array2: [
        0: {
          id: '123',
          string: 'hello world'
        }
      ]
    }
  ],
  i: 0,
  j: 0,
}

为了修改多个嵌套数组,一种方法是 $unwind 它们,根据您的要求修改数据,最后聚合展开的数据。

db.collection.aggregate([
{"$unwind":"$array1"},
{"$unwind":"$array1.array2"},
{"$project":{
    _id:1,
    "array1.id":1,
    "array1.array2.id":1,
    "array1.array2.string":{"$concat":["$array1.array2.string","world"]}

    }
},
{
 "$group": {
  "_id": {"obj_id": "$_id", "arr1_id": "$array1.id"},
  "array2":{$push:"$array1.array2"}
 }
},
{
 "$group": {
  "_id": {"obj_id": "$_id.obj_id"},
  "array1":{"$push":{"id":"$_id.arr1_id", "array2": "$array2"}}
 }
}

])