首页 > 解决方案 > 连接来自不同集合的相同 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'...

所以看起来它几乎就在那里,只需要能够支持数组连接。

标签: mongodbconcatenationpymongo

解决方案


您可以使用$concatArraysor$setUnion以这种方式:

首先$lookup获取另一个集合数组并创建一个名为newArray.

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

然后使用$concatArraysor$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
    }
  }
])

这里的例子


推荐阅读