mongodb - 连接来自不同集合的相同 ID 的 MongoDB 数组
问题描述
我有两个集合 - col1 和 col2 在同一个数据库下。这些集合包含具有两个字段的文档 - _id 和 arr。我正在尝试查找相同 _id 的匹配项,每当找到匹配项时,我都想连接两个 arr 数组。
在 col1 我有以下文件
{'_id': 'shalom', 'arr': [1, 2, 3]}
在 col2 我有以下文件
{'_id': 'shalom', 'arr': [4, 5, 6]}
我想在 col1 中创建一个新文档,看起来像
{'_id': 'shalom', 'arr': [1, 2, 3, 4, 5, 6]}
到目前为止我所做的(不起作用)是
merge_query = {'into': col1,
'on': '_id',
'whenMatched': [
{'$addFields': {
'processed_words': {'$add': ['$arr', '$$new.arr']}}}],
'whenNotMatched': 'insert'}
col2.aggregate([{'$project': project_query},
{'$merge': merge_query}])
运行此程序时,我收到以下异常
pymongo.errors.OperationFailure: $add only supports numeric or date types, not array, full error: {'ok'...
所以看起来它几乎就在那里,只需要能够支持数组连接。
解决方案
您可以使用$concatArrays
or$setUnion
以这种方式:
首先$lookup
获取另一个集合数组并创建一个名为newArray
.
在这里,$lookup
返回一个数组,因此有必要使用它$arrayElementAt
来获取第一个(也是唯一的)位置。
然后使用$concatArrays
or$setUnion
连接字段并删除“辅助”数组。
db.coll1.aggregate([
{
"$lookup": {
"from": "coll2",
"localField": "_id",
"foreignField": "_id",
"as": "newArray"
}
},
{
"$set": {
"newArray": {
"$arrayElemAt": [
"$newArray",
0
]
}
}
},
{
"$set": {
"arr": {
"$setUnion": [
"$arr",
"$newArray.arr"
]
}
}
},
{
"$project": {
"newArray": 0
}
}
])
这里的例子
推荐阅读
- r - 在 R 中将 data.frame 切割成唯一的两半
- azure - 只有通过 terraform 添加资源会导致首先销毁它
- vb.net - 回车打印到文本 VB.net
- c# - Windows 授权在 IIS Express 上的调试中有效,但在 IIS 服务器中无效
- tensorflow - tensorflow 自定义估计器的简单示例
- http - 如何避免在分块传输编码中发送 HTTP 响应
- python - AttributeError:“numpy.float64”对象在时间戳中没有属性“年份”
- python - 我的秒计算器行为异常
- python - 将 Pivot_Table 与 Pandas 一起使用
- python - 每次使用 pygame 时鸟和管道 x 位置相等时,我如何写一些东西来改变我的分数?