为相同ID连接来自不同集合的MongoDB数组

为相同ID连接来自不同集合的MongoDB数组,mongodb,concatenation,pymongo,Mongodb,Concatenation,Pymongo,我在同一个db下有两个集合-col1和col2。这些集合包含具有两个字段的文档-_id和arr。我正在尝试为相同的_id查找匹配项,每当找到匹配项时,我都希望将两个arr数组连接起来 在col1中,我有以下文档 {'_id': 'shalom', 'arr': [1, 2, 3]} {'_id': 'shalom', 'arr': [4, 5, 6]} 在col2中,我有以下文档 {'_id': 'shalom', 'arr': [1, 2, 3]} {'_id': 'shalom', '

我在同一个db下有两个集合-col1和col2。这些集合包含具有两个字段的文档-_id和arr。我正在尝试为相同的_id查找匹配项,每当找到匹配项时,我都希望将两个arr数组连接起来

在col1中,我有以下文档

{'_id': 'shalom', 'arr': [1, 2, 3]}
{'_id': 'shalom', 'arr': [4, 5, 6]}
在col2中,我有以下文档

{'_id': 'shalom', 'arr': [1, 2, 3]}
{'_id': 'shalom', 'arr': [4, 5, 6]}
我想在col1中创建一个新文档,如下所示

{'_id': 'shalom', 'arr': [1, 2, 3, 4, 5, 6]}
到目前为止我所做的(不起作用)是

运行此命令时,我得到以下异常

pymongo.errors.OperationFailure: $add only supports numeric or date types, not array, full error: {'ok'...

所以它看起来就快到了,只需要能够支持数组串联。

您可以通过以下方式使用
$concatarray
$setUnion

首先
$lookup
获取另一个集合数组,并创建一个名为
newArray
的新“辅助”数组

这里,
$lookup
返回一个数组,因此需要使用
$arrayElementAt
获取第一个(也是唯一的)位置

然后使用
$concatarray
$setUnion
对字段进行concat并删除“辅助”数组

db.coll1.aggregate([
{
“$lookup”:{
“from”:“coll2”,
“localField”:“\u id”,
“外域”:“\u id”,
“as”:“newArray”
}
},
{
“$set”:{
“新数组”:{
“$arrayElemAt”:[
“$newArray”,
0
]
}
}
},
{
“$set”:{
“arr”:{
“$setUnion”:[
“$arr”,
“$newArray.arr”
]
}
}
},
{
“$project”:{
“newArray”:0
}
}
])

示例

您可以通过以下方式使用
$concatarray
$setUnion

首先
$lookup
获取另一个集合数组,并创建一个名为
newArray
的新“辅助”数组

这里,
$lookup
返回一个数组,因此需要使用
$arrayElementAt
获取第一个(也是唯一的)位置

然后使用
$concatarray
$setUnion
对字段进行concat并删除“辅助”数组

db.coll1.aggregate([
{
“$lookup”:{
“from”:“coll2”,
“localField”:“\u id”,
“外域”:“\u id”,
“as”:“newArray”
}
},
{
“$set”:{
“新数组”:{
“$arrayElemAt”:[
“$newArray”,
0
]
}
}
},
{
“$set”:{
“arr”:{
“$setUnion”:[
“$arr”,
“$newArray.arr”
]
}
}
},
{
“$project”:{
“newArray”:0
}
}
])

示例

我已经检查过了,工作正常。加入阵列时,需要使用
$concatarray
。操作
$add
用于将其相加的数字,例如(1+1=2)


我已经检查过了,工作正常。加入阵列时,需要使用
$concatarray
。操作
$add
用于将其相加的数字,例如(1+1=2)