如何在 $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"}}
}
}
])
我在一个数组中有一个字符串,它位于另一个数组中。我想将另一个字符串连接到已经存在的字符串(位于两个数组的最后一个索引处)。我有文档中存储的最后一个元素的索引
{
_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"}}
}
}
])